Выбор, где данные `не существует` и выбор столбцов, которые являются пустыми или` является нулевым` - MySQL - PullRequest
0 голосов
/ 10 мая 2019

Это мой запрос:

select * from outerb where not exists(
Select * from wms
where wms.barcode = outerb.barcode);

Этот запрос возвращает мне значения, которые мне нужны.

Пока все хорошо ...

Далее мне нужно было выбрать конкретный столбец (в данном случае pcode), в котором нет записанных значений. Вот что я попробовал и работал абсолютно нормально для меня:

select * from outerb where not exists(
Select * from wms
where wms.barcode = outerb.barcode) 
and pcode = "" or pcode is null;

Но когда я добавляю еще один столбец к запросу, он возвращает мне пустой столбец для pcode, но для нового столбца он возвращает мне пустые значения и заполненные значения. Что я запутался. Вот что я попробовал:

select * from outerb where not exists(
Select * from wms
where wms.barcode = outerb.barcode) 
and pcode = "" or pcode is null
and
brand = "" or brand is null;

Pcode работает абсолютно нормально, но brand не ... в чем проблема?

Но если я поменяю местами два, то brand будет первым в запросе, а pcode будет вторым, его pcode на этот раз будет отображаться со значениями, а brand - без значений.

Обе колонки имеют тип Varchar

Ответы [ 4 ]

1 голос
/ 10 мая 2019

Вероятно, это проблема порядка операций, когда AND имеет более высокий приоритет, чем OR.Попробуйте эту версию:

SELECT *
FROM outerb
WHERE NOT EXISTS (SELECT 1 FROM wms WHERE wms.barcode = outerb.barcode) AND
    (pcode = '' OR pcode IS NULL) AND
    (brand = '' OR brand IS NULL);

Но мы могли бы действительно упростить, чтобы полностью избежать этой проблемы, используя COALESCE:

SELECT *
FROM outerb
WHERE NOT EXISTS (SELECT 1 FROM wms WHERE wms.barcode = outerb.barcode) AND
    COALESCE(pcode, '') = '' AND
    COALESCE(brand, '') = '';
1 голос
/ 10 мая 2019

Поставьте несколько скобок в

select * 
from outerb 
where 
  not exists(
   select * 
   from wms
   where 
     wms.barcode = outerb.barcode
  ) 
  and (pcode = '' or pcode is null)
  and (brand = '' or brand is null);

Всякий раз, когда вы смешиваете И и ИЛИ, используйте скобки, чтобы было ясно как БД, так и человеку, который поддерживает это после вас, какой набор истин идет вместе. Без них MySQL сначала оценит любые AND, а затем оценит любые OR. Это означает, что когда вы говорите:

a AND b OR c AND d OR e

MySQL сделает то, что вы хотели:

(a AND b) OR (c AND d) OR e --MySQL does
a AND (b OR c) AND (d OR e) --you wanted

Совсем другой набор истин, эти двое

Взгляните на Mysql или / и приоритет? для получения дополнительной информации

Сноска от Тима и общие рекомендации при работе с MySQL. MySQL может немного походить на Visual Basic 6 - в настройках по умолчанию он позволяет вам быть немного более неаккуратным в кодировании, чем в большинстве других баз данных. Такие вещи, как отсутствие необходимости указывать явный GROUP BY в запросе, который использует агрегаты; это просто изобретет группировку для вас. Это также позволяет использовать двойные кавычки для строк, когда стандартом SQL являются одинарные кавычки. Стандарт SQL использует двойные кавычки для кавычек имен столбцов и т. Д., Поэтому SELECT a as "my column name with spaces" - MySQL также допускает двойные кавычки для строк, а это не спецификация. Так почему же придерживаться спецификации? Это делает ваши навыки работы с базами данных намного более переносимыми - если вы изучаете стандартный SQL, он работает в большем количестве мест, чем специфичные для MySQL sql, это означает, что вы можете с большей уверенностью сказать на собеседовании, что кросс-навыки вашей базы данных хороши, потому что вы использовали диапазон баз данных, сосредотачивая ваше обучение на стандарте sql, вместо того чтобы говорить «я только когда-либо использовал MySQL, но я уверен, что могу учиться…». Конечно, вы всегда будете сталкиваться с конкретными вещами, поскольку стандарт не поспевает за потребительским спросом, как это делают реализации. Примечание; Я считаю, что Postgres является одной из лучших баз данных для строгого соблюдения спецификаций SQL и, следовательно, обеспечивает хорошую учебную базу данных

0 голосов
/ 10 мая 2019

Добавить скобку к вашему запросу

select * from outerb where not exists(
Select * from wms
where wms.barcode = outerb.barcode) 
and 
(pcode = "" or pcode is null)
and
(brand = "" or brand is null);
0 голосов
/ 10 мая 2019

Нельзя смешивать OR и AND без указания того, что сгруппировано. Используйте скобки, чтобы сгруппировать их.

select * from outerb where not exists(
Select * from wms
where wms.barcode = outerb.barcode) 
and (pcode = "" or pcode is null)
and
(brand = "" or brand is null;)
...