另一種方法,提供所有層次結點的長度都是相同的,就像我這樣修改我的解決方案到this post:
-- sample data
DECLARE @employees TABLE(HierarchyColumn varchar(100))
INSERT @employees
VALUES ('123|456|789|135|246|790'), ('144|451|689|822'), ('144|451|689|822|990|999');
-- your search string
DECLARE @searchString int = 451;
SELECT *
FROM
(
SELECT
HierarchyColumn,
itemLevel = ROW_NUMBER() OVER (PARTITION BY e.HierarchyColumn ORDER BY N),
item = SUBSTRING(e.HierarchyColumn, ((N*4)-3), 3)
FROM @employees e
CROSS APPLY
(
SELECT TOP ((LEN(e.HierarchyColumn)/4)+1) ROW_NUMBER() OVER (ORDER BY (SELECT 1))
FROM
(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) a(x),
(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) b(x),
(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) c(x),
(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) d(x)
) iTally(N)
) x
WHERE item = @searchString;
這不僅會返回節點,還會返回節點在層次結構中的位置級別。
HierarchyColumn itemLevel item
------------------------- --------- ----
144|451|689|822 2 451
144|451|689|822|990|999 2 451
任何奇特的方式將它變成一個單一的LIKE語句,將捕獲所有3種情況?我知道它很多要問,只是好奇 – SBB
''|' + HierarchyColumn +'|'如'%|' + @searchstring +'|%''。它不是[SARGABLE](https://en.wikipedia.org/wiki/Sargable),所以它不能從索引中受益。 – HABO
@HABO - 這是正確的。您不會在優化器選擇的列上進行索引查找。如果你有一個SARGable的基於集合的解決方案,我很樂意看到它。;) –