Что это за синтаксис Oracle: "|| ''"? - PullRequest
3 голосов
/ 29 декабря 2011

Я столкнулся с странным синтаксисом 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 ]

7 голосов
/ 29 декабря 2011

||используется в Oracle для объединения строк, поэтому, если у вас есть переменная нестрокового типа, и вы хотите преобразовать ее в строку, вы можете объединить ее с помощью ''.

3 голосов
/ 29 декабря 2011

Это имеющая оговорка. Поскольку COUNT (MD.MID) = 0 и HAVING COUNT (MD.MID)> 0 равно false, записи не отображаются. Измените его на HAVING COUNT (MD.MID) <100 или удалите его, и результат будет </p>

WEEKLYCOUNT
-----------
          0
...