如何在列中查询该列中的任何值? (即。如何构建一个可以过滤值的动态where子句。)
我希望能够查询特定值。例如,我可能希望值为1,但我可能希望它是任何数字。
有没有办法使用通配符(如“*”)匹配任何值,以便可以动态插入我想要的过滤器?
例如:
select int_col from table where int_col = 1 // Query for a specific value
select int_col from table where int_col = * // Query for any value
我不想使用2个单独的SQL语句的原因是因为我将它用作SQL数据源,它只能有1个select语句。
答案 0 :(得分:38)
有时候我会查询实际值(比如1,2 ......)所以我也不能有条件。
我认为你需要在WHERE
子句上有一些动态行为,而不必动态构建你的WHERE
子句。
使用单个参数,您可以使用ISNULL
(或COALESCE
),如下所示:
SELECT * FROM Table WHERE ID = ISNULL(@id, ID)
允许NULL
参数匹配所有参数。有些人更喜欢更长但更明确的:
SELECT * FROM Table WHERE (@id IS NULL) OR (ID = @id)
答案 1 :(得分:6)
一个简单的答案就是使用:IS NOT NULL。但如果您要求对123456或1234或1237这样的数字说123 *,那么您可以将其转换为varchar,然后使用标准通配符进行测试。
在你的where子句中:cast(myIntColumn as varchar(15)) like '123%'
。
答案 2 :(得分:4)
假设您要过滤的值是存储过程中的参数,或者包含在名为@Value
的变量中,您可以这样做:
select * from table where @Value is null or intCol = @Value
如果@Value
为null,则忽略该子句的or
部分,因此查询不会对intCol进行过滤。
答案 3 :(得分:1)
您可以通过为NULL指定特殊含义将参数用作通配符:
DECLARE @q INT = 1
SELECT * FROM table WHERE IntegerColumn = @q OR @q IS NULL
这样,当你传入NULL;你得到所有的行。
如果NULL是要查询的有效值,则需要使用两个参数。
答案 4 :(得分:1)
数字的通配符相当于比较器。
所以,如果你想找到所有正整数:
select int_col from table where int_col > 0
一百到一千之间的任何数字:
select int_col from table where int_col BETWEEN 100 AND 1000
等等。
答案 5 :(得分:1)
我不太明白你在问什么。我认为你应该针对不同的情况使用两种不同的查询。
当您没有寻找特定值时:
SELECT * FROM table
当您要查找特定值时:
SELECT * FROM table WHERE intcol = 1
答案 6 :(得分:1)
如果你真的希望列的所有行的值都可以使用
select int_col
from table
如果您想知道所有不同的值,但不关心它们重复多少次,您可以使用
select distinct int_col
from table
如果您想知道所有不同的值以及它们各自出现的次数,请使用
select int_col, count(*)
from table
group by int_col
要正确排序值,您可以添加
order by int_col
以上所有查询。
分享并享受。