[英]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的回答。
取决于:
您可以尝试类似:
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.