SQL Server 2014相当于mysql的find_in_set()

时间:2016-03-01 14:34:43

标签: sql sql-server csv find-in-set

我正在使用具有位置表的数据库,例如:

locationID | locationHierarchy
1          | 0
2          | 1
3          | 1,2
4          | 1
5          | 1,4
6          | 1,4,5

使这样的树成为

1
--2
----3
--4
----5
------6

其中locationHierarchy是其所有祖先的locationID的csv字符串(考虑层次结构树)。这样,在给定起始位置ID的情况下,在向树顶部工作时,可以轻松确定层次结构。

现在我需要编写代码以从一个祖先开始并递归地查找所有后代。 MySQL有一个名为'find_in_set'的函数,可以轻松解析csv字符串以查找值。这很好,因为我可以说“在设置中找到值4”,这将给出locationID为4的后代的所有位置(包括4本身)。

不幸的是,这是在SQL Server 2014上开发的,它没有这样的功能。 CSV字符串是一个可变长度(允许几乎无限制的级别),我需要一种方法来查找某个位置的所有祖先。

我在互联网上发现的很多模仿find_in_set函数的SQL Server假定了一个固定的层次深度,例如最多4个级别,这对我来说无效。

有没有人有一个存储过程或任何我可以集成到查询中的东西?我真的不必从这个表中提取所有记录来使用代码来单独解析CSV字符串。

我会想象在locationID%或%,{locationid}中搜索locationHierarchy字符串,%会起作用但速度很慢。

2 个答案:

答案 0 :(得分:0)

我认为你想要like - 在任一数据库中。像这样:

select l.*
from locations l
where l.locationHierarchy like @LocationHierarchy + ',%';

如果您想要包含原始位置,那么一种方法是:

select l.*
from locations l
where l.locationHierarchy + ',' like @LocationHierarchy + ',%';

我还应该注意到SQL Server对递归查询有适当的支持,因此除了层次结构树之外,它还有其他层次结构选项(这仍然是一个非常合理的解决方案)。

答案 1 :(得分:0)

最后它对我有用..

SELECT * FROM locations WHERE locationHierarchy like CONCAT(@param,',%%')    OR
                                    o.unitnumber like CONCAT('%%,',@param,',%%') OR
                                    o.unitnumber like CONCAT('%%,',@param)