21

如何查询该列中的任何值?(即。我如何构建一个可以过滤值的动态 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 语句。

4

7 回答 7

45

有时我会查询实际值(如 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)
于 2012-05-16T16:09:21.920 回答
7

一个简单的答案是:IS NOT NULL。但是,如果您要求 123* 表示 123456 或 1234 或 1237 等数字,那么您可以将其转换为 varchar,然后使用标准通配符进行测试。

在你的 where 子句中:cast(myIntColumn as varchar(15)) like '123%'.

于 2012-05-16T16:04:14.003 回答
4

假设您要过滤的值是存储过程中的参数,或者包含在名为 的变量中@Value,您可以这样做:

select * from table where @Value is null or intCol = @Value

如果@Value为 null or,则忽略子句的部分,因此查询不会在 intCol 上过滤。

于 2012-05-16T16:09:18.003 回答
1

数字通配符的等价物是比较器。

所以,如果你想找到所有的正整数:

select int_col from table where int_col > 0

一百到一千之间的任何数字:

select int_col from table where int_col BETWEEN 100 AND 1000

等等。

于 2012-05-16T16:05:21.250 回答
1

我不太明白你在问什么。我认为您应该针对不同的情况使用两个不同的查询。

当您不寻找特定值时:

SELECT * FROM table

当您正在寻找特定值时:

SELECT * FROM table WHERE intcol = 1 
于 2012-05-16T16:06:23.627 回答
1

您可以通过为 NULL 分配特殊含义来将参数用作通配符:

DECLARE @q INT = 1
SELECT * FROM table WHERE IntegerColumn = @q OR @q IS NULL

这样,当你传入 NULL 时;你得到所有的行。

如果 NULL 是要查询的有效值,则需要使用两个参数。

于 2012-05-16T16:02:32.107 回答
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

以上所有查询。

分享和享受。

于 2012-05-16T16:18:19.810 回答