这是什么Oracle语法:" ||''"?

时间:2011-12-29 15:53:15

标签: oracle join syntax plsql sqlplus

我在我们的一个遗留应用程序中遇到了一些奇怪的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

2 个答案:

答案 0 :(得分:7)

||在Oracle中用于连接字符串,所以,如果你有一个非字符串类型的变量,并且你想将它转换为字符串,你可以用''连接它。

答案 1 :(得分:3)

这是有条款。由于COUNT(MD.MID)= 0且HAVING COUNT(MD.MID)> 0表示错误,不显示任何记录。将其更改为HAVING COUNT(MD.MID)< 100或删除它,输出将是

WEEKLYCOUNT
-----------
          0