我在我们的一个遗留应用程序中遇到了一些奇怪的Oracle语法,我很感兴趣...
查询
(名称已被修改以保护无辜者)
SELECT COUNT(1) AS WEEKLYCOUNT
FROM MONKEYS MD
WHERE
MD.MID||'' IN
(
SELECT DISTINCT MD.MID
FROM MONKEYS MD, GIRAFFES GD
WHERE
(MD.MID = GD.MID(+)||'')
AND CURRENT_STATUS = 'Healthy'
AND GIRAFFE_TYPE = 'Long-necked'
AND INTERESTING_DATE BETWEEN
'22 December 2011' AND '29 December 2011'
)
HAVING COUNT(MD.MID) > 0
我不确定的是||''
语法。到目前为止,我在Oracle中只看到||
用于连接。它在这里似乎没有意义......
关于这是做什么的,关于它为什么这样做以及这种语法如何工作的任何想法都会很棒。
更多信息
有趣的是,这个SQL在SQLPlus中返回以下内容:
no rows selected
Elapsed: 00:00:00.03
SQL>
我重写了相同的SQL(减去奇怪的语法),利用我对系统的了解来生成我相当确定的结果:
SELECT COUNT(1) AS WEEKLYCOUNT
FROM
MONKEYS MD
LEFT JOIN GIRAFFES GD ON GD.MID = MD.MID
WHERE
AND MD.CURRENT_STATUS = 'Healthy'
AND GD.GIRAFFE_TYPE = 'Long-necked'
AND GD.INTERESTING_DATE BETWEEN
'22 December 2011' AND '29 December 2011'
但是,第二个查询产生(预期)以下内容:
WEEKLYCOUNT
-----------
0
Elapsed: 00:00:00.16
SQL>
主要区别在于,即使两个查询都在查找COUNT
,第一个查询也不返回任何行......很奇怪,是吗?
(PS要显示已用时间,我有SET TIMING ON
)
答案 0 :(得分:7)
||在Oracle中用于连接字符串,所以,如果你有一个非字符串类型的变量,并且你想将它转换为字符串,你可以用''连接它。
答案 1 :(得分:3)
这是有条款。由于COUNT(MD.MID)= 0且HAVING COUNT(MD.MID)> 0表示错误,不显示任何记录。将其更改为HAVING COUNT(MD.MID)< 100或删除它,输出将是
WEEKLYCOUNT
-----------
0