我有一个数据库列,其中包含对于特定行可能类似于此u/1u/3u/19/g1/g4
的字符串。
是否有一种高效的方法来获取该列中至少包含以下一个元素['u/3', 'g4']
的所有行?
我知道我可以使用AND
条款,但要验证的元素数量会有所不同,可能会变大......
我在我的项目中使用RoR / ActiveRecord。
答案 0 :(得分: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
如果匹配多个值,您将获得重复记录,因此在那里抛出一个distinct,如果不需要则从select语句中删除Split。
在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