SQL Server 2014 эквивалентен mysql's 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 - это CSV-строка locationID всех своих предков (представьте себе иерархическое дерево). Это позволяет легко определить иерархию при работе с вершиной дерева с учетом начального locationID.

Теперь мне нужно написать код, чтобы начать с предка и рекурсивно найти всех потомков. MySQL имеет функцию с именем 'find_in_set', которая легко анализирует строку csv для поиска значения. Это хорошо, потому что я могу просто сказать "найти в наборе значение 4", что даст всем местоположениям, которые являются потомками locationID из 4 (включая саму 4).

К сожалению, он разрабатывается на SQL Server 2014 и не имеет такой функции. Строка CSV имеет переменную длину (практически неограниченные уровни допускаются), и мне нужен способ найти всех предков локации.

Многое из того, что я нашел в Интернете для имитации функции find_in_set в SQL Server, предполагает фиксированную глубину иерархии (например, максимум 4 уровня), что не сработало бы для меня.

У кого-нибудь есть хранимая процедура или что-нибудь, что я мог бы интегрировать в запрос? Я действительно предпочел бы не извлекать все записи из этой таблицы, чтобы использовать код для индивидуального разбора строки CSV.

Я мог бы представить, что поиск строки locationHierarchy для locationID% или%,{locationid},% будет работать, но будет довольно медленным.

2 ответа

Решение

Я думаю ты хочешь like - в любой базе данных. Что-то вроде этого:

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

Если вы хотите, чтобы исходное местоположение было включено, то один из методов:

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

Следует также отметить, что SQL Server имеет надлежащую поддержку рекурсивных запросов, поэтому у него есть другие параметры для иерархий, кроме деревьев иерархии (которые по-прежнему являются очень разумным решением).

Наконец-то это сработало для меня..

SELECT * FROM locations WHERE locationHierarchy like CONCAT(@param,',%%')    OR
                                    o.unitnumber like CONCAT('%%,',@param,',%%') OR
                                    o.unitnumber like CONCAT('%%,',@param)
Другие вопросы по тегам