2010-08-17 201 views
3

我有這個簡單的查詢有條件的SQL查詢

select * from users where name = 'User1' 

我想延長查詢的功能,無論查詢返回0記錄查詢將由其他條款獲取數據。

where name = 'Default' 

如果第一個子句將獲取一些記錄,第二個子句將被忽略。

編輯

甲骨文

+1

SQL服務器? MySQL的?甲骨文?... – 2010-08-17 09:00:10

回答

7
SELECT * FROM users WHERE name = 'User1' 
UNION ALL 
SELECT * FROM users WHERE name = 'Default' 
    AND NOT EXISTS (SELECT 1 FROM users WHERE name='User1') 
+0

投票你的帖子,而不是糾正我的 – Quassnoi 2010-08-17 09:08:26

+0

@Quassnoi:是不是你的表現稍微好一點,少一個'SELECT'? ...編輯:但我想那是假設'名稱'是獨一無二的。 – 2010-08-17 09:10:11

+0

我不知道oracle - 我在OP指定之前發佈了這個。它很詳細,但適用於SQL Server。 Oracle如何? – mdma 2010-08-17 09:10:39

4
IF EXISTS (SELECT * from users where name = 'User1') 
    SELECT * from users where name = 'User1'; 
ELSE 
    SELECT * from users where name = 'Default'; 
+0

迄今爲止唯一的答案,在所有情況下都能給出正確的結果。 – 2010-08-17 09:06:20

+1

除了在Oracle零售商 – Quassnoi 2010-08-17 09:06:49

+0

@Quassnoi中不起作用,rdbms還沒有被第一次指定。 :),@ mdma爲oracle提供了正確的答案。 – 2010-08-17 09:17:13

1
select top 1 * from users where name in ('User1', 'Default') order by name desc 

:P

+0

我認爲Oracle使用與「TOP」不同的東西。如果'name'有一個唯一的約束,這將工作。 – 2010-08-17 09:06:52

+0

@Martin:我認爲OP最初並未指定Oracle。 – 2010-08-17 09:08:05

+0

@丹尼爾 - 是的,我沒有倒下。 – 2010-08-17 09:09:33

1
WITH T AS (
     SELECT users.*, 
     RANK() OVER (ORDER BY CASE WHEN name = 'User1' THEN 0 ELSE 1 END) AS RN 
     FROM users 
     WHERE name IN ('Default','User1') 
     ) 
SELECT * FROM T 
WHERE RN = 1