SQL "Join" для нулевых значений - PullRequest
21 голосов
/ 18 ноября 2009

По независящим от меня причинам мне нужно объединить две таблицы, и мне нужны нулевые значения для соответствия. Лучший вариант, который я мог придумать, - это выложить UUID и использовать его в качестве значения для сравнения, но это выглядит некрасиво

SELECT * FROM T1 JOIN T2 ON nvl(T1.SOMECOL,'f44087d5935dccbda23f71f3e9beb491') = 
   nvl(T2.SOMECOL,'f44087d5935dccbda23f71f3e9beb491')

Как я могу сделать лучше? Это в Oracle, если это имеет значение, и контекст - это приложение, в котором пакет загруженных пользователем данных должен сравниваться с пакетом существующих данных, чтобы увидеть, совпадают ли какие-либо строки. Оглядываясь назад, мы должны были запретить использование любых столбцов соединения в любом наборе данных, содержащих нули, но мы этого не сделали, и теперь мы должны жить с этим.

Редактировать: Для ясности, я не только , связанный с нулями. Если столбцы не равны NULL, я хочу, чтобы они соответствовали фактическим значениям.

Ответы [ 12 ]

0 голосов
/ 18 ноября 2009

Разве это не то же самое, что проверка наличия нулей в обоих столбцах?

SELECT * FROM T1, T2 WHERE T1.SOMECOL IS NULL and T2.SOMECOL IS NULL

или

SELECT * FROM T1 CROSS JOIN T2 WHERE T1.SOMECOL IS NULL and T2.SOMECOL IS NULL
0 голосов
/ 18 ноября 2009

Просто добавив это - есть ли способ объединить эти нули в известное значение, например, в пустую строку? Недостаточное знание того, как устроена ваша таблица, означает, что я не могу быть уверен, что вы потеряете значение таким образом - то есть наличие пустой строки, представляющей «пользователь отказался ввести номер телефона», а NULL - «мы забыли» спросить об этом ", или что-то в этом роде?

Вероятность того, что это невозможно, я уверен, но если это так, у вас будут известные значения для сравнения, и вы сможете получить законное соединение таким образом.

...