MySQL - использование столбца из CASE WHEN в предложении WHERE

0

Я хочу создать команду 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.

Спасибо за вашу помощь.

  • 1
    Вы не можете использовать псевдонимы из выражений выбора в предложении WHERE.
  • 0
    Итак, как я могу сделать это, чтобы получить результат, как я хочу?
Показать ещё 2 комментария
Теги:

3 ответа

0
Лучший ответ

(Изменение: удаленные материалы больше не применяются после получения дополнительной информации.)

Чтобы конкретно показать предложение в комментариях для полноты:

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
;
  • 0
    Это не помогает мне, потому что мне нужно добавить значение is null вместо = NULL . В моем скрипте очень важно установить нулевое значение, я не могу сделать это только с = 1.
  • 0
    Ты имеешь в виду, что тебе нужно ... img_user_id <=> CASE ... ? `<=> является нулевым безопасным оператором равенства.
Показать ещё 5 комментариев
1

Вы можете использовать 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.

  • 0
    да, теперь я проверил это и = NULL - плохая идея, потому что я получил 0 результатов. Есть идеи для этого?
  • 0
    Не могли бы вы отредактировать вопрос и объяснить, что должен делать весь запрос? Покажите пример данных и желаемый результат. Есть ли связь между images и table_private ?
Показать ещё 5 комментариев
0

Получите данные во внешнем запросе, например

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;
  • 0
    Когда NOT EXISTS () имеет значение true, тогда столбец exist_value = NULL. Тогда в операторе выбора есть: AND img_user_id = NULL; но это может быть: AND img_user_id is NULL

Ещё вопросы

Сообщество Overcoder
Наверх
Меню