Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何进行高级搜索查询?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何进行高级搜索查询?

Sql 如何进行高级搜索查询?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试建立一个免费的婚姻网站,主页上有一些文本框和下拉列表,还有一个搜索按钮 单击它会将访问者带到另一个页面以及所有字段的查询字符串 我使用以下存储过程来显示搜索结果。 参数: cmd.Parameters.AddWithValue("@cat", cat); cmd.Parameters.AddWithValue("@subcat", subcat == "-1" ? "-1" : "," + subcat); cmd.Parameters.AddWithValue("@state", s

我正在尝试建立一个免费的婚姻网站,主页上有一些文本框和下拉列表,还有一个搜索按钮

单击它会将访问者带到另一个页面以及所有字段的查询字符串

我使用以下存储过程来显示搜索结果。 参数:

cmd.Parameters.AddWithValue("@cat", cat);
cmd.Parameters.AddWithValue("@subcat", subcat == "-1" ? "-1" : "," + subcat);
cmd.Parameters.AddWithValue("@state", state);
cmd.Parameters.AddWithValue("@city", city == "-1" ? "-1" : "," + city);

问题是我被OR&AND困住了

如果我使用OR,那么它将显示许多不相关的结果

如果我使用,那么如果任何搜索查询为空,该怎么办

对不起,我是新手,我的问题对你们朋友来说可能太幼稚了


另一个问题是,这是否是最好且安全的方法?如果没有,我该如何改进它。

我不知道您需要过滤哪些数据,但我认为您可以尝试在以下内容中使用
…或@var='

WHERE (a.ad_cat=@cat OR a.ad_cat='-1' OR a.ad_cat='') 
AND ((a.ad_subcat LIKE N'%'+@subcat+'%' OR a.ad_subcat LIKE N'%'+@subcat) OR a.ad_subcat='-1' OR @subcat='') 
AND (a.ad_state=@state OR a.ad_state='-1' OR @state='')  
AND ((a.ad_city LIKE N'%'+@city+'%' OR a.ad_city LIKE N'%'+@city) OR a.ad_city='-1' OR @city='')

好吧,我觉得搜索逻辑很难。如果我是你,我可能会试试这样的东西。它应该总是返回一定数量的结果(在我的例子中是10行),更相关的结果将首先出现

SELECT TOP 10 * --or any number of rows
FROM
(
     SELECT TOP 10 *,1 AS result_order
     FROM yourTable
     WHERE 1=1 AND 2=2

     UNION ALL

     SELECT TOP 10 *,2 AS result_order
     FROM yourTable
     WHERE 1=1 OR 2=2
)
ORDER BY result_order

看起来逗号可能会导致问题,参数“,”+subcat中的逗号。我认为这应该是subcat,因为您正在将它与列ad_subcat的内容进行比较。@Mike在适当的情况下使用表中的默认值。{a.ad_subcat,如N'%+@subcat+'%'或a.ad_subcat,如N'%+@subcat}-这里不需要第二部分,它要找的东西应该由第一个找到part@JamesZ我想像这样过滤我的搜索结果:@JamesZ这是我对这个问题的完整描述这是我对这个问题的完整描述这是我对这个问题的完整描述
SELECT TOP 10 * --or any number of rows
FROM
(
     SELECT TOP 10 *,1 AS result_order
     FROM yourTable
     WHERE 1=1 AND 2=2

     UNION ALL

     SELECT TOP 10 *,2 AS result_order
     FROM yourTable
     WHERE 1=1 OR 2=2
)
ORDER BY result_order