如何进行高级搜索查询?

时间:2015-04-12 06:12:06

标签: sql sql-server tsql

我正在尝试建立一个免费的婚姻网站,其中主页包含一个带有一些文本框的简单形式。下拉菜单和搜索按钮。

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

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

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);

    ALTER PROCEDURE [dbo].[SearchGetAdPageWise]  
       ,@cat INT
       ,@subcat NVARCHAR(10)
       ,@state INT
       ,@city NVARCHAR(10) 
    AS  

    BEGIN  
          SET NOCOUNT ON;  

SELECT ROW_NUMBER() OVER  
            (  
                  ORDER BY a.ad_type ASC,NEWID()
            )AS RowNumber  
      ,a.Id
      ,a.ad_title
      ,b.Name a_state
      ,a.ad_brief  
      ,a.ad_pic    
    INTO #Results  
    FROM [tbl_ads] a LEFT JOIN tbl_state b ON a.ad_state=b.Id

 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 a.ad_subcat='') 
AND (a.ad_state=@state OR a.ad_state='-1' OR a.ad_state='')  
AND ((a.ad_city LIKE N'%'+@city+'%' OR a.ad_city LIKE N'%'+@city) OR a.ad_city='-1' OR a.ad_city='')

问题是我被OR&和

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

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

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

另一个问题,如果它是最好的&安全的方式这样做?如果没有,那么我该如何改进呢。

2 个答案:

答案 0 :(得分:0)

我不知道您需要过滤哪些数据,但我认为您可以尝试在以下内容中使用...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='')

答案 1 :(得分:0)

好的,我搜索逻辑很难。如果我是你,我可能会尝试这样的事情。它应该总是返回一定数量的结果(在我的情况下是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