Выберите, где либо значение столбца, но не оба - PullRequest
1 голос
/ 18 апреля 2019

Есть таблица T0, которая выглядит так и использует MySQL 5.7.Я храню идентификаторы в id, текст в C1, и NULL или целые числа в C2 - NULL является значением по умолчанию.Запись в C1 может иметь несколько значений в C2.Если вы знаете о таблицах Closure, вы заметите, что эта таблица немного отличается тем, что записи C1 не соответствуют записям id.

id | C1 | C2
---+----+-----
1  | a  | NULL
2  | b  | NULL
3  | c  | NULL
4  | c  | 3
5  | c  | 5
6  | d  | NULL

Значение C1 сохраняется в C2.Таблица установлена ​​так, что C1 не может иметь повторяющиеся значения в C2.Так, например, с не может иметь два 3.Таким образом, таблица уникальна в этом смысле.

Хотелось бы, чтобы запрос возвращал все строки, где значение поля C1 равно 3, а если значение C1 не равно 3, возвращает строку, где значение C1 равно NULL.

Пробовал следующий код, но длябезрезультатно.

SELECT *
FROM T0
WHERE C2 = 3 OR C2 IS NULL

Таким образом, запрос должен иметь возможность вернуть 1, 2, 4 и 6. Желаемый результат:

id | C1 | C2
---+----+-----
1  | a  | NULL
2  | b  | NULL
4  | c  | 3
6  | d  | NULL

Ответы [ 4 ]

2 голосов
/ 18 апреля 2019

Вы можете проверить это условие, используя NOT EXISTS:

SELECT *
FROM t
WHERE (
    C2 = 3
) OR (
    C2 IS NULL AND NOT EXISTS (
        SELECT 1
        FROM t AS x
        WHERE x.C1 = t.C1 AND x.C2 = 3
    )
)
0 голосов
/ 18 апреля 2019

Вы должны отобразить идентификатор? Если нет, то это становится легко-peasy:

select c1, max(c2)
from t0
where c2 = 3 or c2 is null
group by c1
order by c1;
0 голосов
/ 18 апреля 2019

Это более простой подход, и он будет быстрее, чем объединение, когда в таблице много строк.

SELECT * 
  FROM T0 
 WHERE (C2 = 3) 
    OR (C2 IS NULL AND 
        C1 NOT IN (SELECT C1 FROM T0 WHERE C2 = 3))
0 голосов
/ 18 апреля 2019

Как насчет использования UNION?

SELECT * FROM t0 where C2=3 
UNION 
SELECT * FROM t0 where C2 IS NULL AND C1 NOT IN (SELECT C1 FROM t0 WHERE C2<>3) ORDER BY id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...