#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
);