具有多个值的SQL复杂搜索查询

时间:2012-04-27 04:58:10

标签: sql sql-server sql-server-2008 asp-classic

我正在努力实现一些我不知道该怎么做的事情。我正在开发一个基于ASP Classic和SQL 2008,IIS7的网站。在搜索页面中,我可以选择为每个查询设置一些值,例如default.asp?q=one|two|three&q2=four|five|six 我想要做的是使用通配符,以防我的查询没有价值,并且能够同时搜索一列中的单词,以防我的查询有多个值。以下是我想要做的事情:

  1. 如果查询有值,那么在数据库中就好了(这很简单)
  2. 如果查询的值与“|”分开然后将它们拆分并搜索所有这些。
  3. 如果查询根本没有值,则使用通配符,不要搜索 什么都没有。
  4. 所以为了达到这个目的,我尝试了几件事,但没有取得任何成功。这是我的代码示例。

    一个-----------

    @style nVarchar(150) = ''
    Select * FROM mytable WHERE CONTAINS(style, @style) AND ...
    

    我可以设法将查询拆分为类似'"* value1 *" OR "* value2 *"'的内容,以便从CONTAINS中获得最佳结果,但如果“style”具有值,则可以使用此查询。如果style没有值,则没有通配符,因此我可以在不过滤数据库的情况下检索所有数据。

    两个---------------

    @style nVarchar(150) = ''
    Select * FROM mytable WHERE style LIKE '%' + @style + '%' AND ...
    

    使用LIKE子句,我可以使用'%'之类的通配符,如果样式没有任何值,但我无法在同一列中搜索耦合值。
    所以,请记住我正在使用“存储过程”,因为这有点复杂,我需要在几个地方使用它。我将有10-12查询此搜索 任何想法都会帮助我实现这一目标。

1 个答案:

答案 0 :(得分:1)

我理解你的问题是用“|”分隔的值。在SQL 2008中,您可以使用Xml函数将字符串转换为表并根据基表进行查询:

DECLARE @style VARCHAR(MAX) = 'value1|value2|value3'
DECLARE @v XML 
SET @v = '<r><n>' + REPLACE(@style, '|', '</n><n>') + '</n></r>'

SELECT * FROM mytable
OUTER APPLY 
(
    SELECT c.value('text()[1]', 'varchar(50)') AS v FROM @v.nodes('//n') AS t(c)
) t
WHERE style LIKE '%' + t.v + '%'

有帮助吗?