Oracle。SQL。解码
Oracle数据库11g版本11.2.0.4.0-64位生产版PL/SQL版本11.2.0.4.0-生产"CORE 11.2.0.4.0生产";TNS for Linux:版本11.2.0.4.0-生产版NLSRTL版本11.2.0.4.0-生产
DECODE函数有一些有趣的地方,我搞不清楚,我担心过去做过的所有查询。
我将尝试用一个我认为是让自己被理解的最佳方式的例子来解释它。
SELECT COUNT(*)
FROM (SELECT DECODE((SELECT COUNT(*)
FROM schema.table2 t2
WHERE t2.col2 = 2
AND t2.col1 = t1.col1), 0, 1, 0) AS num_col2_1,
DECODE((SELECT COUNT(*)
FROM schema.table2 t2
WHERE t2.col2 = 2
AND t2.col1 = t1.col1), 0, 0, 1) AS num_col2_2
FROM schema.table1 t1)
WHERE num_col2_1 = 1
num_col2_1和num_col2_2的结果虽然相反,但应该是相同的,但事实并非如此。
按字段筛选:
其中numtip1=0--计数(*)=1<--ERROR必须是3
其中numtip1=1--计数(*)=1--结果正常
其中numtip2=0--计数(*)=1--结果正常
其中numtip2=1--计数(*)=3--结果正常
其中numtip1="0"--计数(*)=3--结果正常
其中numtip1="1"--计数(*)=1--结果正常
其中numtip2="0"--计数(*)=1--结果正常
其中numtip2="1"--计数(*)=3--结果正常
差异按DECODE函数返回的值的顺序排列。
- AND t2.col1=t1.col1),0,1,0)AS num_col2_1
- 与t2.col1=t1.col1),0,0,1)作为num_col2_2
Oracle DECODE()函数语法DECODE(e,s1,r1[,s2,r2],…,[,sn,rn][,d]);
返回值DECODE()函数返回一个值,其中是第一个结果(r1、r2、..rn或d)参数的数据类型。
它返回的数据类型不应该是数字?
对于num_col2_2,似乎是这样,但对于num_col2 _1,它不是
- num_col2_1="0"--结果正常<--为什么
- num_col2_1="1"--结果正常<--为什么
我希望我已经很好地解释了自己。我想了解发生了什么或者我做错了什么。
您的DECODE语句具有相同的测试条件,但具有不同的默认值
我在下面对它们进行了编码,并运行内部查询以显示中间结果集,其中只包含结果集
如果您希望我们进一步考虑该案例,请提供您正在处理的表定义和示例数据。
<blockquote\SELECT DECODE((SELECT COUNT(*) FROM table2 t2 WHERE t2.col2 = 2 AND t2.col1 = t1.col1), 0, 1, 0) AS num_col2_1, DECODE((SELECT COUNT(*) FROM table2 t2 WHERE t2.col2 = 2 AND t2.col1 = t1.col1), 0, 0, 1) AS num_col2_2 FROM table1 t1
NUM_COL2_1|NUM_COL2_2---------:|--------:0|10|10|10|1
SELECT COUNT(*)
FROM (SELECT DECODE((SELECT COUNT(*)
FROM table2 t2
WHERE t2.col2 = 2
AND t2.col1 = t1.col1), 0, 1, 0) AS num_col2_1,
DECODE((SELECT COUNT(*)
FROM table2 t2
WHERE t2.col2 = 2
AND t2.col1 = t1.col1), 0, 0, 1) AS num_col2_2
FROM table1 t1)
WHERE num_col2_1 = 1
>|COUNT(*)||-------:||0|<blockquote\
SELECT COUNT(*)
FROM (SELECT DECODE((SELECT COUNT(*)
FROM table2 t2
WHERE t2.col2 = 2
AND t2.col1 = t1.col1), 0, 1, 0) AS num_col2_1,
DECODE((SELECT COUNT(*)
FROM table2 t2
WHERE t2.col2 = 2
AND t2.col1 = t1.col1), 0, 0, 1) AS num_col2_2
FROM table1 t1)
WHERE num_col2_2 = 1
>|COUNT(*)||-------:||4|
db<gt;小提琴这里