MySQL Где НЕ ВСЕ НУЛЬ? - PullRequest
       61

MySQL Где НЕ ВСЕ НУЛЬ?

0 голосов
/ 30 апреля 2020

Как запрос с возможностью проверки всех выбранных записей не является нулевым? Например, с помощью следующего запроса убедитесь, что все строки с полем is_field_null не равны NULL из возвращенных level1?

SELECT * FROM (
SELECT tb_a.A, tb_b.is_field_null FROM tb_a, tb_b, tb_c
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"
AND tb_a.b = tb_b.a
AND tb_c.b = tb_b.c
) AS level1

Предположим, что некоторые строки с is_field_null в level1 действительно NULL, а таблицы

tb_a

a          |    b        |      A
------------------------------------------
"some"     | "thing"     | "XXX"
"some"     | "thing"     | "YYY"

tb_b

a            | c           | is_field_null 
----------------------------------------------
"thing"       | "else"      | "I have things here" 
"thing"       | "else"      | NULL

tb_ c

b            | c           | mapper 
----------------------------------------------
"else"       | "else"      | "ZZZ" 
"else"       | "else"      | "KKK"

Я пробовал следующее, которое возвращает некоторые строки с is_field_null, не равным NULL. Например,

A        |     is_field_null
-----------------------------
"XXX"    | "I have things here"
"YYY"    | "I have things here"
SELECT * FROM (
SELECT tb_a.A, tb_b.is_field_null FROM tb_a, tb_b, tb_c
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"
AND tb_a.b = tb_b.a
AND tb_c.b = tb_b.c
) AS level1
WHERE level1.is_field_null IS NOT NULL

Я ожидал бы пустую таблицу. Как мне это сделать?

Например

SELECT * FROM (
SELECT tb_a.A, tb_b.is_field_null FROM tb_a, tb_b, tb_c
WHERE tb_a.a = "some" AND tb_a.b = "thing" AND tb_c.c = "else"
AND tb_a.b = tb_b.a
AND tb_c.b = tb_b.c
) AS level1
WHERE level1.is_field_null IS NOT ALL NULL ??

1 Ответ

1 голос
/ 30 апреля 2020

Если вы используете MySQL 8.0, простой метод использует оконные функции:

SELECT *
FROM (
    SELECT 
        tb_a.A,
        tb_b.is_field_null,
        MAX(tb_b.is_field_null IS NULL) has_null
    FROM tb_a 
    INNER JOIN tb_b ON tb_a.b = tb_b.a
    INNER JOIN tb_c ON tb_c.b = tb_b.c
    WHERE 
        tb_a.a = 'some' 
        AND tb_a.b = 'thing' 
        AND tb_c.c = 'else'
) t
WHERE has_null = 0

Обратите внимание, что при этом используются стандартные явные объединения, а не неявные неявные объединения - этот древний синтаксис не должен использоваться в новом коде.

Также я бы рекомендовал одинарные кавычки вместо двойных кавычек для буквенных строк (это синтаксис MySQL).

...