2013-02-22 60 views
0

檢查列入任何元素我有一個包含字符串,可能是這個樣子u/1u/3u/19/g1/g4特定行的數據庫列。SQL查詢從陣列

有一個高性能的方式來獲得具有以下要素['u/3', 'g4']該列中的至少一個的所有行?

我知道我可以使用AND條款,但以驗證對因人而異元素的數量,並可能成爲大..

我在我的項目中使用回報率/ ActiveRecord的。

+0

我不認爲有一個dbms,不需要一個完整的表掃描來產生該where子句的結果。難道你不能用fk將該列標準化爲兩個表,因此可以使用內部連接嗎? – rene 2013-02-22 11:58:12

+0

你會如何構建where子句(全表掃描),如果檢查陣攻擊雖然大小不同? – ErwinM 2013-02-22 12:00:28

+0

據我所知,沒有這樣的方法。建議像上面提到的@rene那樣重構db。 – 2013-02-22 12:30:48

回答

0

在sql server中,您可以使用XML將您的搜索參數列表轉換爲記錄集,然後將其與基表交叉連接,然後使用charIndex()查看列是否包含子字符串。

,因爲我不知道你的表或列名稱,我使用的是已經有數據,其中有一列「phone_home」表(人)。要搜索包含「202」或任何一個電話號碼「785」我會用這個查詢:

select person_id,phone_home,Split.data.value('.', 'VARCHAR(10)') 
from (select *, cast('<n>202</n><n>785</n>' as XML) as myXML 
     from persons) as data cross apply myXML.nodes('/n') as Split(data) 
where charindex(Split.data.value('.', 'VARCHAR(10)'),data.phone_Home) > 0 

你會得到重複的記錄,如果它匹配多個值,所以在拋出一個獨特的存在,並刪除如果不需要,則從select語句中拆分。

在SQL中使用XML是巫術,我...我計上心來,從這個帖子http://www.sqljason.com/2010/05/converting-single-comma-separated-row.html

不知道會有怎樣的表現就像是......但至少目前還沒有任何遊標或動態SQL。

編輯:鑄造XML是非常緩慢的,所以我使它成爲一個變量,所以它只被鑄造一次。

declare @xml XML 
set @xml = cast('<n>202</n><n>785</n>' as XML) 

select person_id,phone_home,Split.persons.value('.', 'VARCHAR(10)') 
from persons cross apply @xml.nodes('/n') as Split(persons) 
where charindex(Split.persons.value('.', 'VARCHAR(10)'),phone_Home) > 0