表大致是这样的
列:ID,  C1, C2, C3, C4,DATA
    001   1    0    0    0   xxxx
    002   0    0    1    0   xxxx
    。。首先会传入一个唯一的ID,找到一行;
这一行一般情况下列A,B,C,D只有一个为1,其余全为零;
我希望通过SQL语句得到的是列的序号。要求一定要通过PL/SQL 或SQL语言实现
最好是在SELECT时就能够被取出来。即:如果ID = 002, 那么C3列的值为1,将返回3。我尝试了一个CASE语句,但是没有取出期望的数据。
CURSOR cur IS
SELECT DATA,
   CASE
   WHEN C1 = 1 THEN
1
   WHEN C2 = 1 THEN
2
   WHEN C3 = 1 THEN
3
   WHEN C4 = 1 THEN
4
   ELSE
0
   END AS ROOT
  FROM XXXX
 WHERE ID = inputID;

大家帮个忙,给出具体的解决方案,100分奉上!

解决方案 »

  1.   

    这样就行了:
    select date,decode(C1,1,1,decode(C2,1,2,decode(C3,1,3)),null) as root
    from tab;
      

  2.   

    select decode(c1,1,1,0)+decode(c2,1,2,0 )+decode(c3,1,3,0 )+decode(c4,1,4,0 )
    from xxxx
    where id = inputId
    这样
      

  3.   

    select date,decode(C1,1,1,decode(C2,1,2,decode(C3,1,3,decode(C4,1,4,0)),0) as root
    from tab
    where id = 具体值;
      

  4.   

    select length(to_number(C1||C2||C3||c4)) FROM table另外的思路
      

  5.   

    select length(to_number(C4||C3||C2||c1)) FROM table
    是不是应该调换一下位置?思路很不错,学习
      

  6.   

    还有个问题
    select length(to_number(C4||C3||C2||c1)) FROM table
    这样做如果4个字段值都为0应该返回0,这样是返回1了
      

  7.   

    select nvl(length(decode(to_number(C4||C3||C2||c1),0,null,to_number(C4||C3||C2||c1))),0) FROM table 这样就可以了,呵呵
      

  8.   

    || 在SQL里面是连接字符串吧?
    小弟新学,麻烦稍微解释一下
      

  9.   

    HelloWorld_001()的思路太棒了,学习
      

  10.   

    || 在pl/SQL里面是连接字符串
      

  11.   

    我那样写的话对数据要求的比较高
    ||是oracle里面的连接
      

  12.   

    select length(to_number(C4||C3||C2||c1)) FROM table
    没算法原理的
    C4||C3||C2||c1合并成1个字段   比如0001(c1=1),但是这样如果是字符的话,length()=4
    所以to_number()变成数字就是1了,再求length()=1
    再来C4||C3||C2||c1    1000(c4=1)to_number()变成数字就是1000了 再求length()=4取巧的方法,因为你要的数字正好等于length()
    否则的话你要么用case when then  else
    或者就是前面的decode(字段,条件1,结果1,....最后都不符合的结果)
      

  13.   

    select decode(1,c1,1,c2,2,c3,3,c4,4,null) from table where condition
      

  14.   

    HelloWorld_001() 的思维很别致,顶下
      

  15.   

    另外再求教一下
    我在调试SQL的时候,发现总是找不到需要的结果
    最后发现是有人在修改我添加的测试行5555
    请问诸位前辈
    有没有办法让我在生成行数据后直接将该行锁定,在我解锁之前别的客户端不能随意修改这一行呢????
      

  16.   

    你偷偷的建个表
    create table TEST_CESHI
    as select * from table这样就你知道表名了,就没人改了
    统计结束后
    drop table TEST_CESHI
    就好了