【问题标题】:SQL: Where MYID = ANY?SQL:其中 MYID = ANY?
【发布时间】:2011-04-22 10:43:02
【问题描述】:

在 SQL 查询中,包含

... WHERE MYID = @1 ....

我必须处理 2 个案例
1) 列上有一个过滤器,@1 将是一个数字 (1,2,X...)

2) 该列上没有过滤器,@1 将是...? (任何)

这个“任何”(SQL Server 2005)有什么东西吗?

附言。
显然,我知道我可以删除“哪里”。

PPS。
我解释一下自己以便更好地理解:我在代码中有这个查询,并且想在过滤器打开时传递一个整数作为参数,当我的过滤器关闭时传递“某事”。

if (filterOn)
    GetFoos(fooID);
else
    GetFoos("ANY");

GetFoos(param1): "select * from FOOS where FOOID = {0}", param1

【问题讨论】:

  • 你为什么不直接执行 2 个分离查询。根据@1 值选择一个。

标签: sql sql-server-2005


【解决方案1】:

在两个语句中创建一个UNION ALL:

SELECT  *
FROM    mytable
WHERE   myid = @col
UNION ALL
SELECT  *
FROM    mytable
WHERE   @col IS NULL

或者只是将它们拆分为存储过程的IF / ELSE 块。

无论哪种方式,优化器都可以单独优化查询,根据@col 的值完全忽略其中一个。

【讨论】:

  • @serhio:只需传递 NULL 而不是 'ANY'。
【解决方案2】:

你可以这样做:

 where (myid = @id or @id is null)

所以您只会在 @id 包含值时过滤,而不是在 null 时过滤。

【讨论】:

  • 当存在 一个特定的@id 要查找的情况下,这种情况的表现会受到惩罚,如这里讨论的sommarskog.se/dyn-search-2005.html
  • @serhio:ID 列不应该为空,但参数可以是,表示您真的不想对其进行过滤。或者您可以使用值 0 来表示“不过滤”。
  • 好的,我明白了。现在想想这不是一个过程,而是一个 SQL 字符串,就像select * from FOOS where FOOID = {0}...
【解决方案3】:

如果该列上没有过滤器,只需删除 where 或 and 子句。

【讨论】:

    【解决方案4】:

    如果您不想过滤特定列,请不要过滤该列。完全删除WHERE MYID =

    【讨论】:

    • 我有一个字符串查询。是否有可能保持原样,但只是替换某些东西而不是“任何”?
    • 如果您使用LIKE 而不是=,那么我认为您可以使用WHERE MYID LIKE % 匹配任何内容。编辑:WHERE MYID LIKE 42 仍然只匹配 42。
    • @serhio:你在哪里执行这个查询?某种编程语言或存储过程?
    • 为什么不能更改查询?
    • @serhio: LIKE 4 不匹配 42
    【解决方案5】:

    有

    "select * from FOO where FOOID = {0}", param
    

    当没有要过滤的参数时使用 param="FOOID",这将给出

    select * from FOO where FOOID = FOOID // removing the filter
    

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多