[英]SQL Server 2014 equivalent to 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是其所有祖先的locationID的csv字符串(以層次結構樹為例)。 在給定起始locationID的情況下,在朝樹的頂部工作時,可以輕松確定層次結構。
現在,我需要編寫代碼以始祖,並遞歸地找到所有后代。 MySQL具有一個名為“ find_in_set”的函數,該函數可以輕松解析csv字符串以查找值。 很好,因為我可以說“找到設置值4”,這將給出locationID為4的后代(包括4本身)的所有位置。
不幸的是,這是在SQL Server 2014上開發的,沒有任何功能。 CSV字符串的長度是可變的(幾乎允許無限制的級別),我需要一種方法來查找某個位置的所有祖先。
我在互聯網上發現的許多將find_in_set函數模仿到SQL Server的功能都假定了固定的層次結構深度(例如最多4個級別),這對我不起作用。
是否有人有存儲過程或我可以集成到查詢中的任何內容? 我真的希望不必從該表中提取所有記錄來使用代碼分別解析CSV字符串。
我可以想象在locationHierarchy字符串中搜索locationID%或%,{locationid},%會起作用,但是速度很慢。
我想你想要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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.