DECODE函数在某些情况下会以文本形式返回一个数字



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语句具有相同的测试条件,但具有不同的默认值
我在下面对它们进行了编码,并运行内部查询以显示中间结果集,其中只包含结果集
如果您希望我们进一步考虑该案例,请提供您正在处理的表定义和示例数据。

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
<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_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;小提琴这里

最新更新