求教一个比较怪异的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