2017-07-19 116 views
0

我试图编写一个查询,该查询具有可选的输入参数。如果该参数留空,我必须从表中选择每条记录。如果该参数不是空的,我只能通过它提供的值进行过滤。我的想法是使用CASE声明,但由于某种原因,无论我放入@list变量,我都会得到空结果集。任何更好的想法?在WHERE子句中使用不同场景的SQL语句

SELECT * FROM my_tables 
WHERE column_one IN (
    CASE 
     WHEN LEN(@list) > 0 THEN @list 
     ELSE (SELECT column_one FROM my_table) END 
) 
+2

Case _expression_。 – jarlh

+2

在WHERE和ON子句中使用AND/OR而不是CASE通常更好。 – jarlh

+0

我有一个类似的问题。请检查我在这里得到的回复https://stackoverflow.com/questions/25872970/where-clause-selecting-term-codes –

回答

0

试试这个代码:

SELECT * FROM my_tables 
WHERE 
    (LEN(@list) > 0 AND column_one = @list) 
    OR (LEN(@list) = 0 AND column_one IN (SELECT column_one FROM my_table)) 
1

写2个不同的SQL两个情况和UNION他们。只有一个查询会提供结果,另一个将始终提供空结果集。类似这样的:

SELECT * FROM my_tables 
WHERE LEN(@list) > 0 and column_one IN (@list) 

UNION 

SELECT * FROM my_tables 
WHERE LEN(@list) = 0 and column_one IN (SELECT column_one FROM my_table)