SQL - использование нулевого значения в качестве символа подстановки - PullRequest
0 голосов
/ 23 января 2020

Я объединяю два стола, Линнмон и Тарандо.

SELECT
  Linnmon.ID         AS Linnmon,
  COUNT(Tarrendo.ID) AS Tarrendous
FROM
( SELECT * FROM
        (SELECT 1 AS ID, 'RED'  AS Colour FROM Dual)
  UNION (SELECT 2 AS ID, 'BLUE' AS Colour FROM Dual)
  UNION (SELECT 3 AS ID,  null  AS Colour FROM Dual)
) Linnmon
LEFT OUTER JOIN Tarendo
ON Tarendo.Colour = Linnmon.Colour

Linnmon.Colour:null предназначен для подстановочных знаков и соответствует любому Tarendo.Colour, поэтому:

ON Tarendo.Colour = NVL(Linnmon.Colour, Tarendo.Colour)

Однако сегодня я имею дело с данными, где Tarendo.Colour может быть null, и я хочу сопоставить Linnmon.Colour:null с любым значением для Tarendo.Colour, включая null.

Я придумал это, который работает, но с использованием строкового литерала и многих других NVL s чувствует себя неправильно - есть ли лучший способ?

ON NVL(Tarendo.Colour, 'asdf') = NVL(Linnmon.Colour, NVL(Tarendo.Colour, 'asdf'))

Учитывая, что я сам собрал Linnmon - самостоятельную сборку в моем собственном утверждении SQL - я не привязан к использованию null как подстановочный знак, и если есть лучшая практика, я мог бы сделать это вместо этого.

Ответы [ 2 ]

1 голос
/ 23 января 2020

Если Linnmon.Colour IS NULL должен соответствовать любому Tarendo.Colour, тогда предложение ON становится:

ON Tarendo.Colour = Linnmon.Colour OR Linnmon.Colour IS NULL
1 голос
/ 23 января 2020

Используйте явные логики c вместо магических значений:

ON (Tarendo.Colour = Linnmon.Colour) OR
   (Linnmon.Colour IS NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...