2012-04-27 102 views
1

我试图实现一些我不知道如何去做的事情。我正在基于ASP Classic和SQL 2008,IIS7的网站上工作。在搜索页面中,我可以选择每个查询有几个值,如default.asp?q=one|two|three&q2=four|five|six
我试图做的是使用通配符万一我的查询没有价值,并有能力同时在一列中搜索几个单词,以防万一我的查询有夫妇价值。下面是我想做的事:具有多值的SQL复杂搜索查询

  1. 如果查询值然后去罚款,在数据库中(这是非常简单)
  2. 如果查询夫妇与价值分离“|”然后将它们分开并搜索它们全部。
  3. 如果查询完全没有价值,则使用通配符,不要搜索 。

因此,为了达到这个目的,我尝试了几件事情,但没有取得任何成功。这是我的代码的例子。

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

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

我可以设法查询拆分成类似'"* value1 *" OR "* value2 *"',以获得最好的结果了包含但是这一个是工作,如果“风格“有价值。如果样式没有价值,则不存在通配符,因此我可以在不过滤数据库的情况下检索所有数据。

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

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

随着LIKE子句我可以使用通配符像'%'的情况下,风格没有任何价值,但我不能搜索夫妇值在同一列。
所以,请记住我使用“存储过程”,因为这是一种复杂的,我需要在几个地方使用它。我将有10-12查询此搜索。
任何想法都会帮助我实现这一目标。

回答

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 + '%' 

它有帮助吗?

+0

谢谢你的时间。它确实有帮助,但是你能否稍微解释一下外部应用?就像在“SELECT c.value('text()[1]','varchar(50)')AS v FROM @ v.nodes('// n')AS t(c)”中发生的那样。非常感谢。 – Jay 2012-04-27 18:06:29

+0

OUTER或CROSS APPLY是允许为查询返回的每一行调用表函数的运算符。检查SQL Server联机丛书上的[documentation](http://msdn.microsoft.com/en-us/library/ms175156(v = SQL.90).aspx),这里很好解释。子查询SELECT c.value ...用于从基于“value1 | value2 | value3”文本创建的Xml中提取行集。 nodes()函数返回XPath指定的节点“// n”和c.value('text()[1]'...)提取文本。 value()方法需要index [1]来指示第一个文本节点。 – 2012-04-28 12:54:04

+0

感谢您的解释。我会继续阅读该文档。如果我有几个查询,我不得不复制这个时间到我的查询? – Jay 2012-04-29 17:07:55