Любой трюк для создания запроса, который не выводит строку, когда выполняются определенные условия, и строку, когда они не выполняются (без подвыборов)?

#mysql #sql #subquery

#mysql #sql #подзапрос

Вопрос:

Может быть, это слишком очевидно, но я уверен, что это должен быть простой способ сделать это

 SELECT 'Not Contained Yet' AS FlagRow
FROM (
    SELECT 'Already Contained'
    FROM MyTable t
    WHERE t.id=? 
    AND CURDATE()=t.date  
    LIMIT 1
) aux
HAVING COUNT(*)=0
 

Это просто не возвращает результатов, если регистр уже есть в базе данных (по идентификатору, дате) и возвращает строку с сообщением «Еще не содержится», если он не существует.

Есть ли способ запросить эту особенность без использования подвыборов? Мне просто нужна одна строка с тарабарщиной, поскольку она действует как триггер для запуска моего ETL в случае, если для этого дня и идентификатора нет записей

Ответ №1:

Вы должны быть в состоянии сделать это с помощью having :

 SELECT 'Not Contained Yet' AS FlagRow
FROM MyTable t
WHERE t.id = ? and CURDATE()=t.date
HAVING COUNT(*) = 0;
 

Комментарии:

1. @user1352530 … Наверное, не глупый. SQL — сложный язык, и все мы время от времени пропускаем полезные вещи.

Ответ №2:

Используя count() , вы получаете 0 , если он не содержит записи

 SELECT count(*) as contains_count
FROM MyTable t
WHERE t.id = ? 
AND DATE(NOW()) = t.date  
 

Комментарии:

1. Спасибо, но мне не нужны результаты конкретно, если условия выполнены, поскольку любая строка действует как триггер для моего ETL

2. Может ли a 0 не действовать как триггер?

3. Нет, потому что я выполняю следующий шаг для каждой входящей строки

Ответ №3:

 SELECT CASE WHEN count(*) = 0 THEN 'Not Contained Yet' ELSE null END CASE
FROM MyTable t
WHERE t.id=? 
AND CURDATE()=t.date  
 

Комментарии:

1. К сожалению, он возвращает строку (нулевую)