用于检查是否包含数组中任何元素的SQL查询

时间:2013-02-22 11:52:23

标签: sql ruby-on-rails-3 activerecord

我有一个数据库列,其中包含对于特定行可能类似于此u/1u/3u/19/g1/g4的字符串。

是否有一种高效的方法来获取该列中至少包含以下一个元素['u/3', 'g4']的所有行?

我知道我可以使用AND条款,但要验证的元素数量会有所不同,可能会变大......

我在我的项目中使用RoR / ActiveRecord。

1 个答案:

答案 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