1

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

  1. 如果查询有价值,那么在数据库中就可以了(这很简单)
  2. 如果查询有一对用“|”分隔的值 签名然后拆分它们并搜索所有这些。
  3. 如果查询根本没有价值,则使用通配符并且不要搜索任何内容。

所以为了实现这一点,我尝试了几件事,但没有取得任何成功。这是我的代码示例。

一 - - - - - -

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

我可以设法将查询拆分为类似'"* value1 *" OR "* value2 *"'从 CONTAINS 中获得最佳结果的查询,但是如果“样式”具有价值,则此查询有效。如果样式没有值,则没有通配符,因此我可以检索所有数据而无需过滤数据库。

二 - - - - - - - -

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

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

4

1 回答 1

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

它有帮助吗?

于 2012-04-27T06:19:35.623 回答