我试图实现一些我不知道如何去做的事情。我正在基于ASP Classic和SQL 2008,IIS7的网站上工作。在搜索页面中,我可以选择每个查询有几个值,如default.asp?q=one|two|three&q2=four|five|six
。
我试图做的是使用通配符万一我的查询没有价值,并有能力同时在一列中搜索几个单词,以防万一我的查询有夫妇价值。下面是我想做的事:具有多值的SQL复杂搜索查询
- 如果查询值然后去罚款,在数据库中(这是非常简单)
- 如果查询夫妇与价值分离“|”然后将它们分开并搜索它们全部。
- 如果查询完全没有价值,则使用通配符,不要搜索 。
因此,为了达到这个目的,我尝试了几件事情,但没有取得任何成功。这是我的代码的例子。
一个-----------
@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查询此搜索。
任何想法都会帮助我实现这一目标。
谢谢你的时间。它确实有帮助,但是你能否稍微解释一下外部应用?就像在“SELECT c.value('text()[1]','varchar(50)')AS v FROM @ v.nodes('// n')AS t(c)”中发生的那样。非常感谢。 – Jay 2012-04-27 18:06:29
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
感谢您的解释。我会继续阅读该文档。如果我有几个查询,我不得不复制这个时间到我的查询? – Jay 2012-04-29 17:07:55