Я хочу создать команду SQL, которая будет проверять, существует ли запись и:
1) если он существует, он будет равен 1,
2) если он не существует, он будет равен NULL.
И следующий шаг - это значение (1 или NULL), которое я хочу использовать в предложении WHERE.
Поэтому скрипт должен проверять, существует ли запись в table_private
, если да, то он должен искать:
SELECT * FROM 'images' WHERE advert_id = 5795 and img_user_id = 1
если нет, он должен искать:
SELECT * FROM 'images' WHERE advert_id = 5795 and img_user_id is NULL
Вот моя команда sql:
SELECT *, CASE WHEN NOT EXISTS (SELECT * FROM 'table_private' WHERE
client_id = 1 AND id = 5795) THEN NULL ELSE 1 END AS exist_value
FROM 'images' WHERE advert_id = 5795 AND img_user_id = exist_value;
Но я получил:
Nieznana kolumna 'exist_value' w where clause
Почему? Этот столбец существует - когда я AND img_user_id = exist_value
эту часть команды: AND img_user_id = exist_value
, sql корректно возвращает этот столбец в качестве resuslt.
Спасибо за вашу помощь.
(Изменение: удаленные материалы больше не применяются после получения дополнительной информации.)
Чтобы конкретно показать предложение в комментариях для полноты:
SELECT *, CASE WHEN NOT EXISTS (SELECT * FROM 'table_private' WHERE
client_id = 1 AND id = 5795) THEN NULL ELSE 1 END AS exist_value
FROM 'images'
WHERE advert_id = 5795
AND img_user_id
<=> /* exist_value */
CASE WHEN NOT EXISTS (SELECT *
FROM 'table_private'
WHERE client_id = 1 AND id = 5795)
THEN NULL
ELSE 1
END
;
is null
вместо = NULL
. В моем скрипте очень важно установить нулевое значение, я не могу сделать это только с = 1.
... img_user_id <=> CASE ...
? `<=> является нулевым безопасным оператором равенства.
Вы можете использовать HAVING
для фильтрации на основе вычисленного значения в списке SELECT
.
SELECT *,
CASE WHEN NOT EXISTS (
SELECT *
FROM 'table_private'
WHERE client_id = 1 AND id = 5795)
THEN NULL
ELSE 1
END AS exist_value
FROM 'images' WHERE advert_id = 5795
HAVING img_user_id <=> exist_value;
<=>
является нулевым безопасным оператором равенства, он позволяет сравнивать с NULL
.
= NULL
- плохая идея, потому что я получил 0 результатов. Есть идеи для этого?
images
и table_private
?
Получите данные во внешнем запросе, например
SELECT * FROM (
SELECT *,
CASE WHEN NOT EXISTS (SELECT * FROM 'table_private' WHERE
client_id = 1 AND id = 5795) THEN NULL ELSE 1 END AS exist_value
FROM 'images' ) xxx
WHERE advert_id = 5795
AND img_user_id = exist_value;
exist_value
= NULL. Тогда в операторе выбора есть: AND img_user_id = NULL;
но это может быть: AND img_user_id is NULL