【发布时间】:2021-03-28 17:52:47
【问题描述】:
我有这张桌子:
create table Test (Value varchar(111))
insert Test select 'a,b,c'
我想创建一个表值函数,我通过 Test.Value 并返回下表:
其中Value 来自Test 表,而Item 值以这种方式生成:第一项本身就是整个值(例如,它由三个逗号分隔的值组成),一旦没有任何三个逗号分隔的值,我们从左到右查找两个逗号分隔的值。
我们严格按照从左到右的顺序进行,因此不需要像 a,c 或 b,a 这样的项目。然后我们最终得到一个逗号分隔的值,即a、b 和c。
ItemLayer 只是一个正在处理的层。显然,分隔符应该是逗号,tvf 应该返回Item 和ItemLayer。我认为查询应该是这样的:
SELECT *
FROM Test t
CROSS JOIN fn_getItemsFromValues(t.Value) f
我认为应该有某种递归 CTE,但我不知道如何。
如果Value 是'a,b,c,d',这是一个输出:
我正在使用 SQL Server 2017。我已经尝试过了,但我被卡住了。这里有些不对劲。
DECLARE @data VARCHAR(100) = 'a,b,c'
;WITH CTE AS
(
SELECT @data TXT, LEFT(@data,1) Col1
UNION ALL
SELECT STUFF(TXT,1,1,'') TXT, LEFT(TXT,1) Col1 FROM CTE
WHERE LEN(TXT) > 0
)
select Col1,txt from CTE
【问题讨论】:
-
请将您的问题编辑为:1) 指定您正在使用的 SQL Server 版本(在这种情况下很重要)和 2) 显示您迄今为止编写的 UDF 代码并解释它为什么不起作用给你。
-
@AlwaysLearning ,完成
-
@EricKlaus 。 . .为什么没有
'a,c'的组合? -
@GordonLinoff ,我不需要。我需要严格地从左到右走,没有任何跳跃。在 a,c 我们跳过 b,这就是我们儿子没有它的原因
标签: sql sql-server tsql common-table-expression