2012-04-27 97 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