2012-01-20 70 views
2

我应该如何去这样做是这样的:SQL Select语句检查条件

如果下面的选择有任何行

SELECT ID, NAME FROM TABLE WHERE [email protected] 

然后返回实际的选择,否则使用另一个SELECT语句。

我用somwthing像

IF EXISTS(SELECT ID, NAME FROM TABLE WHERE [email protected]) 
    SELECT ID, NAME FROM TABLE WHERE [email protected] 
ELSE 
    SELECT QTY FROM TABLE WHERE [email protected] 

但这样一来我的检查,一旦实际返回记录集使用的第一选择两次(一次。

+0

ID是否唯一标识'TABLE'中的行?是否从同一个表中选择ELSE条件(如果是这样,它将始终评估为0)? –

回答

2

它不是像你一样低效如果你真的想避免重复,你可以做类似于...

SELECT ID, NAME FROM TABLE WHERE [email protected] 

IF (@@rowcount = 0) 
    SELECT QTY FROM TABLE WHERE [email protected] 

这里的问题是您现在最多返回2个记录集到客户端。其中第一个是空的(但字段标题等,仍然返回 - 只有0记录)

您可以通过将结果插入表变量来避免这种情况,并且只有在有记录时才将它们返回给客户端。但是我认为这会比仅仅使用EXISTS()像你已经做的慢得多。

+0

无论如何,两个结果集的形状是不同的,所以没有必要将它们强制联系在一起。我打算发布这个完全相同的东西。 –

+0

我不同意:'EXISTS'并没有指示优化器做任何具体的事情,比如“找到1条记录后停止”(这显然是空的集合,这是不可能的) – onedaywhen

+0

@onedaywhen - 所有的SQL都是一个表达式的逻辑处于更高的抽象层次,而不是实际执行的逻辑。 EXISTS()是'0记录等于false,更多等同于真'的语法。SQL Server的优化器效率足够高,如果在将结果作为EXISTS()操作的一部分提供时发现任何记录,它就会终止执行。总之,我不同意你的不同意;) – MatBailie

2
DECLARE @ID INT, 
     @NAME VARCHAR(50); 

SELECT @ID = ID, 
     @NAME = NAME 
FROM TABLE WHERE [email protected]; 

IF(@@ROWCOUNT = 1) 
    SELECT @ID AS ID, @NAME AS NAME 
ELSE 
    SELECT QTY FROM TABLE WHERE [email protected] 
+0

好主意,如果第一个选择保证返回最多一行,但不会像现在写入那样工作。您还需要将'Name'分配给一个变量。然后有条件逻辑选择变量或做其他选择。而且这也是MySQL的语法... –

+0

关于MySQL:BUSTED! (但我认为这是普遍的)请随意编辑语法。关于工作流程:如果第一个查询不返回任何行,第二个将会返回。 Oups!只是s/<>/=在IF –

+0

我冒昧地编辑它在SQL Server中工作。如果我歪曲了你的意图,当然可以把它推回去。 –