0

u/1u/3u/19/g1/g4我有一个数据库列,其中包含一个字符串,该字符串对于特定行可能看起来像这样。

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

我知道我可以使用AND子句,但是要验证的元素数量会有所不同并且可能会变得很大。

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

4

1 回答 1

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
于 2013-03-01T20:55:29.367 回答