簡體   English   中英

SQL Server 2014相當於mysql的find_in_set()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM