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)