繁体   English   中英

SQL搜索用例或

[英]SQL Search using case or if

到目前为止,每个人都提供了超级帮助。 我的下一个问题是对我来说最好的方法是什么...如果我有7个字段可以让用户搜索进行搜索的最佳方法,那么他们可以将7个字段进行任意组合,所以7 ! 或5040组合,无法编码那么多编码。 那么,当用户选择字段1和字段3或他们选择字段1,字段2和字段7时,我该如何处理? 使用SQL可以轻松做到这一点吗? 我不知道应该使用IF语句还是选择语句中的CASE 还是我应该走一个完全不同的方向? 好吧,如果有人有任何有用的指示,我将不胜感激。

谢谢

您可能需要考虑为此使用动态SQL。 请参阅: T-SQL中的动态搜索条件全部捕获以获取有关此主题的好文章。

Select f1,f2  from table where f1 like '%val%' or f2 like '%val%'

可以编写一个将每个参数都接受为null的存储过程,然后像下面这样编写WHERE子句:

WHERE (field1 = @param1 or @param1 is null) 
AND (field2 = @param2 or @param2 is null) etc...

但是我不推荐它。 这样做肯定会影响性能,具体取决于您拥有的参数数量。 在这种情况下,我通过研究动态SQL来支持Joe Stefanelli的回答。

取决于:

  • 您的数据看起来如何,
  • 他们有多大
  • 预期的结果如何准确(所有匹配记录或前100条就足够了),
  • 您的数据库有多少资源。

您可以尝试类似:

CREATE PROC dbo.Search(
  @param1 INT = NULL,
  @param2 VARCHAR(3) = NULL
)
AS

BEGIN
  SET NOCOUNT ON

  -- create temporary table to keep keys (primary) of matching records from searched table     
  CREATE TABLE #results (k INT)

  INSERT INTO 
    #results(k)
  SELECT -- you can use TOP here to norrow results
    key
  FROM
    table
  -- you can use WHERE if there are some default conditions

  PRINT @@ROWCOUNT

  -- if @param1 is set filter #result    
  IF @param1 IS NOT NULL BEGIN
    PRINT '@param1'

    ;WITH d AS (
      SELECT
        key
      FROM
        table
      WHERE
        param1 <> @param1
    )
    DELETE FROM 
      #results
    WHERE
      k = key

    PRINT @@ROWCOUNT
  END

  -- if @param2 is set filter #result
  IF @param2 IS NOT NULL BEGIN
    PRINT '@param2'

    ;WITH d AS (
      SELECT
        key
      FROM
        table
      WHERE
        param2 <> @param2
    )
    DELETE FROM 
      #results
    WHERE
      k = key

    PRINT @@ROWCOUNT
  END

  -- returns what left in #results table
  SELECT
    table.* -- or better only columns you need
  FROM
    #results r
    JOIN
      table 
    ON
      table.key = r.k
END

我在大型数据库(数百万条记录,但在大型服务器上运行)上使用了此技术,以从一些预定义的数据中过滤数据。 而且效果很好。

但是我不需要所有匹配的记录-取决于查询10-3000个匹配的记录就足够了。

如果使用存储过程,则可以使用以下方法:

CREATE PROCEDURE dbo.foo 
    @param1 VARCHAR(32) = NULL, 
    @param2 INT = NULL 
AS 
BEGIN 
    SET NOCOUNT ON 

SELECT * FROM MyTable as t
WHERE (@param1 IS NULL OR t.Column1 = @param1)
AND   (@param2 IS NULL OR t.COlumn2 = @param2)

END 
GO 

这些通常称为可选参数。 这个想法是,如果您不传递任何值,它将获得默认值(null),并且where子句的该部分始终返回true。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM