另一种方法,提供所有层次结点的长度都是相同的,就像我这样修改我的解决方案到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的基于集合的解决方案,我很乐意看到它。;) –