【问题标题】:What is this Oracle Syntax: "||''"?这个 Oracle 语法是什么:“||''”?
【发布时间】:2012-01-29 23:57:08
【问题描述】:

我在我们的一个旧应用程序中遇到了一些看起来很奇怪的 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

【问题讨论】:

    标签: oracle join syntax plsql sqlplus


    【解决方案1】:

    ||在 Oracle 中用于连接字符串,因此,如果您有一个非字符串类型的变量并且想要将其强制转换为字符串,您可以使用 '' 连接它。

    【讨论】:

    • 所以澄清一下,这个语法仅仅是casting 的东西作为一个字符串?感谢您的快速回复。
    • 但是你为什么要这样做呢?我能想到的唯一一件事就是禁用 MD.MID 上的索引。执行带有和不带有 ||'' 的解释计划,您可能会看到全表扫描而不是索引范围扫描
    • @Robert:你会想要这样做,所以 GD.MID 被转换为 varchar2,而不是将 MD.MID 转换为数字(Oracle 数据类型优先级默认情况下会将字符串转换为数字)比较不同类型的值)。显然,这仅在MD.MID 首先可以包含非数字文本时才有用。顺便说一句,如果这是推理,使用to_charcast 会更易读。
    • @Allen:明确的答案。但是,当与 MD.MID 的 IN 列表进行比较时,MD.MID||'' 的用途是什么?我看到的唯一效果是在外部选择中绕过 MD.MID 上的索引。
    • 仅仅因为它在生产代码中并不意味着它有意义 ^^
    【解决方案2】:

    这是有子句。由于 COUNT(MD.MID) = 0 且 HAVING COUNT(MD.MID) > 0 为假,因此不显示任何记录。将其更改为 HAVING COUNT(MD.MID)

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

    【讨论】:

    • 谢谢,你说的很对。 HAVING 子句导致了结果的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2012-07-25
    • 2011-11-13
    • 2014-03-31
    相关资源
    最近更新 更多