Mysql — Использовать вторичный подзапрос тогда и только тогда, когда первый подзапрос вернул пустой

#mysql #sql

#mysql #sql

Вопрос:

Учитывая две таблицы подзапроса t1 и t2, как я могу вернуть t2 тогда и только тогда, когда t1 вернул пустые строки?

Редактировать: Добавлен пример

T1

 SELECT * 
  FROM common_table 
 WHERE language_id = 1
  

T2

 SELECT * 
  FROM common_table 
 WHERE language_id = 2
  

В основном, что я делаю, так это то, что в случае, если T1 возвращает пустые строки, я бы хотел, чтобы он выполнил T2 и вернул эти строки. Теперь я полностью осознаю, что могу сделать это на PHP, но запрос является подзапросом, и я бы предпочел, чтобы его обрабатывал код SQL (не PHP).

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

1. SQL не является языком программирования.

2. Можете ли вы опубликовать фактическую инструкцию SQL, которую вы пытаетесь изменить?

Ответ №1:

 Select ...
From common_table
Where language_id = 1
    Or  (
        language_id = 2
        And Not Exists  (
                        Select 1
                        From common_table
                        Where language_id = 1
                        )
        )
  

Ответ №2:

В MSSQL я могу сделать что-то вроде

 If EXISTS (SELECT * FROM common_table WHERE language_id = 1)
BEGIN
    SELECT * FROM common_table WHERE language_id = 1
END ELSE BEGIN
    SELECT * FROM common_table WHERE language_id = 2
END
  

Должно быть то же самое в MySQL или аналогичное

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

1. хотя это не sql, это t-sql.

2. В вопросе конкретно указан mysql, но это не работает в mysql. Интересно знать, но не уверен, почему это принятый ответ.

Ответ №3:

Мои знания MySQL немного подзабыты, и я думаю, что это должно сработать.

 SELECT * FROM common_table 
         WHERE language_id = 2 and 
               0 = ( SELECT count(*) FROM common_table 
                                     WHERE language_id = 1
                   ) ;
  

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

1. 1 Я думаю, что улучшение могло бы быть ... WHERE (language_id = 1) OR (language_id = 2 AND NOT EXISTS (SELECT NULL FROM common_table WHERE language_id = 1)) . В моем тестировании это дает все lang_id 1 записи, если таковые имеются, в противном случае все lang_id 2, и EXISTS может быть более эффективным, чем COUNT.

Ответ №4:

 SELECT * 
  FROM common_table 
 WHERE language_id = 1
UNION
SELECT * 
  FROM common_table 
 WHERE language_id = 2
       AND NOT EXISTS (
                       SELECT * 
                         FROM common_table AS T2 
                        WHERE T2.language_id = 1
                      );