2016-06-02 3 views
0

У меня есть таблица A, которая соединена с таблицей B «ИСПОЛЬЗОВАНИЕ» column_1. Я хочу запрос, чтобы показать все строки в таблице A, где значение в column_2 не равно ни одному из значений в column_2, column_3 или column_4 из объединенной строки в таблице В.Обработка NULL при использовании оператора NOT EQUAL

Итак, я попытался с помощью:

WHERE 
A.column_2 <> B.column_2 AND 
A.column_2 <> B.column_3 AND 
A.column_2 <> B.column_4 

Теперь, если каждая ячейка в B.column_2, B.column_3 и B.column_4 имеет некоторое значение, проверка запроса будет работать, и она отобразит все строки в таблице A, где значение в A.column_2 не имеет соответствует таблице B.

Проблема возникает, если некоторые из ячеек таблицы B имеют значение NULL. Тогда результаты не будут возвращены. Это, кажется, потому что MySQL рассматривает следующий быть ЛОЖЬ:

23 <> NULL 

... И так как запрос ищет те случаи, когда все проверки возвращают TRUE, она ничего не возвращает.

Следующее - это работа, которую я использовал, разместив столбцы таблицы B, обернутые вокруг с помощью IFNULL, где значение IFNULL равно 0. По существу это преобразует все эти NULL-ячейки в 0 ... и, следовательно, проверку NOT EQUAL будет правильно возвращать TRUE, если совпадений нет, и отобразятся строки, указанные в таблице A. Код выглядит так:

WHERE 
A.column_2 <> IFNULL(B.column_2, 0) AND 
A.column_2 <> IFNULL(B.column_3, 0) AND 
A.column_2 <> IFNULL(B.column_4, 0) 

Это, кажется, круглый способ справиться с этим. Есть ли лучший способ справиться с этим?

+0

вы можете использовать функцию Coalesce –

+0

@Jordan IFNULL() в значительной степени так же, как сливаются(), просто ограниченное 1 значением. – Shadow

ответ

0

ВЫ можете также использовать < => Оператор.

см

MariaDB [(none)]> SELECT 1 <> 1 , 1 <> 0 , 0 <> 0, 0 <> NULL , NULL <> 0 , 0 <=> NULL, NULL <=> 0, NULL <=> NULL; 
+--------+--------+--------+-----------+-----------+------------+------------+---------------+ 
| 1 <> 1 | 1 <> 0 | 0 <> 0 | 0 <> NULL | NULL <> 0 | 0 <=> NULL | NULL <=> 0 | NULL <=> NULL | 
+--------+--------+--------+-----------+-----------+------------+------------+---------------+ 
|  0 |  1 |  0 |  NULL |  NULL |   0 |   0 |    1 | 
+--------+--------+--------+-----------+-----------+------------+------------+---------------+ 
1 row in set (0.00 sec) 

MariaDB [(none)]> 
+0

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

0

Я хотел бы использовать not in оператор вместо:

... WHERE A.column_2 NOT IN (B.column_2,B.column_3,B.column_4) 
+0

ЭТО! Я использую IN и NOT IN для других вещей. Однако обычно он находится в наборе статических значений. Я забываю, что на ячейку можно ссылаться таким же образом. Приятно, что IN будет работать, чтобы проверить на противоположность, то есть показать мне все строки, которые соответствуют. Престижность! – PhoenixTech

+0

Затем pls отметьте ответ, как принято показывать другим зрителям этой темы, что вопрос теперь разрешен! – Shadow

+0

сделал. Однако он не покажет, что я сделал, пока не заработал 15 очков репутации. (Я все еще новичок здесь). – PhoenixTech

Смежные вопросы