2010-08-17 117 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