檢查列入任何元素我有一個包含字符串,可能是這個樣子u/1u/3u/19/g1/g4
特定行的數據庫列。SQL查詢從陣列
有一個高性能的方式來獲得具有以下要素['u/3', 'g4']
該列中的至少一個的所有行?
我知道我可以使用AND
條款,但以驗證對因人而異元素的數量,並可能成爲大..
我在我的項目中使用回報率/ ActiveRecord的。
檢查列入任何元素我有一個包含字符串,可能是這個樣子u/1u/3u/19/g1/g4
特定行的數據庫列。SQL查詢從陣列
有一個高性能的方式來獲得具有以下要素['u/3', 'g4']
該列中的至少一個的所有行?
我知道我可以使用AND
條款,但以驗證對因人而異元素的數量,並可能成爲大..
我在我的項目中使用回報率/ ActiveRecord的。
在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
我不認爲有一個dbms,不需要一個完整的表掃描來產生該where子句的結果。難道你不能用fk將該列標準化爲兩個表,因此可以使用內部連接嗎? – rene 2013-02-22 11:58:12
你會如何構建where子句(全表掃描),如果檢查陣攻擊雖然大小不同? – ErwinM 2013-02-22 12:00:28
據我所知,沒有這樣的方法。建議像上面提到的@rene那樣重構db。 – 2013-02-22 12:30:48