SQL “Соединение” на нулевых значениях

Да, вы можете.

import pygame

pygame.init()
while 1:
    print pygame.time.get_ticks()
    pygame.time.wait(10)

Это даст вам время в миллисекундах, так как pygame начался без появления графического пользовательского интерфейса.

22
задан Dan 18 November 2009 в 20:43
поделиться

8 ответов

Возможно, это сработает, но я никогда не пробовал этого:

SELECT * 
FROM T1 JOIN T2 
ON T1.SOMECOL = T2.SOMECOL OR (T1.SOMECOL IS NULL AND T2.SOMECOL IS NULL)
42
ответ дан 29 November 2019 в 03:59
поделиться

@Sarath Avanavu

Этот не лучший подход. Если TA.COL1 сохранит значение 0, и ТБ COL2 является ПУСТЫМ, то это присоединится к тем записям, который не корректен.

SELECT *
FROM TABLEA TA
JOIN TABLEB TB ON NVL(TA.COL1,0)=NVL(TB.COL2,0);
0
ответ дан 29 November 2019 в 03:59
поделиться

В SQL Server я использовал:

WHERE (a.col = b.col OR COALESCE(a.col, b.col) IS NULL)

Очевидно неэффективно , из-за ИЛИ, но если нет зарезервированного значения, вы можете сопоставить NULL с обеих сторон без двусмысленности или сворачивания, это лучшее, что вы можете сделать (и если да, то почему NULL даже разрешен в вашем дизайне ...)

6
ответ дан 29 November 2019 в 03:59
поделиться

Вы ничего не можете сделать лучше, но JOIN, который у вас есть, никоим образом не будет выполнять фактическое "JOIN" (не будет никакой корреляции между T1.SOMECOL и T2.SOMECOL кроме того, что оба они имеют значение NULL для этого столбца). В основном это означает, что вы не сможете использовать JOIN для NULL, чтобы увидеть, совпадают ли строки.

NULL никогда не равен другому NULL. Как может что-то неизвестное значение быть равным чему-то еще неизвестному?

3
ответ дан 29 November 2019 в 03:59
поделиться

Для такого рода задач Oracle внутренне использует недокументированную функцию sys_op_map_nonnull (), где ваш запрос станет:

SELECT *
FROM T1 JOIN T2 ON sys_op_map_nonnull(T1.SOMECOL) = sys_op_map_nonnull(T2.SOMECOL)

Недокументированным, поэтому будьте осторожны, если вы пойдете по этому маршруту.

3
ответ дан 29 November 2019 в 03:59
поделиться

Вы действительно хотите иметь возможность присоединяться к таблицам, если значение равно нулю? Разве вы не можете просто исключить возможные нулевые значения в предикате соединения? Мне трудно понять, что строки в двух таблицах могут быть связаны нулевым значением. Если у вас есть 100 значений NULL в table1.col_a и 100 NULL в table2.col_b, вы получите 10000 строк, возвращенных только для строк с NULL. Звучит неправильно.

Однако вы сказали, что вам это нужно. Могу ли я предложить объединить нулевой столбец в меньшую строку, поскольку сравнение символов относительно дорого. Еще лучше объединить нули в целое число, если данные в столбцах будут текстовыми.

1
ответ дан 29 November 2019 в 03:59
поделиться

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

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

0
ответ дан 29 November 2019 в 03:59
поделиться

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

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
ответ дан 29 November 2019 в 03:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: