日期:2014-05-17  浏览次数:20727 次

求教一个比较怪异的SQL查询问题的解决方案!谢谢大家了!
表大致是这样的
列: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分奉上!



------解决方案--------------------
这样就行了:
select date,decode(C1,1,1,decode(C2,1,2,decode(C3,1,3)),null) as root
from tab;
------解决方案--------------------
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
这样
------解决方案--------------------
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 = 具体值;
------解决方案--------------------
楼上都说了,用DECODE
------解决方案--------------------
我倒是有一个疑问,我心里总觉得函数套函数执行起来可能会比较慢一些,但真实情况不是很了解,有没有人高手解答一下,这两种都行的解决方法那种效率快些,谢谢
------解决方案--------------------
select length(to_number(C1||C2||C3||c4)) FROM table

另外的思路
------解决方案--------------------
select length(to_number(C4||C3||C2||c1)) FROM table
是不是应该调换一下位置?思路很不错,学习
------解决方案--------------------
还有个问题
select length(to_number(C4||C3||C2||c1)) FROM table
这样做如果4个字段值都为0应该返回0,这样是返回1了
------解决方案--------------------
select nvl(length(decode(to_number(C4||C3||C2||c1),0,null,to_number(C4||C3||C2||c1))),0) FROM table 这样就可以了,呵呵
------解决方案--------------------
HelloWorld_001()的思路太棒了,学习
------解决方案--------------------
|| 在pl/SQL里面是连接字符串
------解决方案--------------------
我那样写的话对数据要求的比较高
||是oracle里面的连接
------解决方案--------------------
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