SQL Server 2016 中 STRING_SPLIT 位置的返回值 [英] return value at a position from STRING_SPLIT in SQL Server 2016

查看:49
本文介绍了SQL Server 2016 中 STRING_SPLIT 位置的返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以在 SQL Server 2016 或更高版本中使用 STRING_SPLIT 函数返回特定位置的值吗?

Can I return a value at a particular position with the STRING_SPLIT function in SQL Server 2016 or higher?

我知道不能保证选择的顺序,但它是否与 STRING_SPLIT 一起使用?

I know the order from a select is not guaranteed, but is it with STRING_SPLIT?

DROP TABLE IF EXISTS #split

SELECT 'z_y_x' AS splitIt
INTO #split UNION
SELECT 'a_b_c'

SELECT * FROM #split;

WITH cte
AS (
SELECT      ROW_NUMBER() OVER ( PARTITION BY s.splitIt ORDER BY s.splitIt ) AS position,
            s.splitIt,
            value
FROM        #split s
CROSS APPLY STRING_SPLIT(s.splitIt, '_')
)
SELECT * FROM cte WHERE position = 2

这是否总是返回第二个元素的值?b 代表 a_b_c,y 代表 z_y_x?

Will this always return the value at the 2nd element? b for a_b_c and y for z_y_x?

我不明白为什么 Microsoft 不在此函数的值旁边返回位置指示器列.

I don't understand why Microsoft doesn't return a position indicator column alongside the value for this function.

推荐答案

简单的答案是,不.到目前为止,微软拒绝在 STRING_SPLIT 中提供 Ordinal 位置作为返回数据集的一部分.恐怕您需要使用不同的解决方案.例如 Jeff Moden 的 DelimitedSplit8k.

The simple answer is, no. Microsoft so far have refused to provide Ordinal position as part of the return dataset in STRING_SPLIT. You'll need to use a different solution I'm afraid. For example Jeff Moden's DelimitedSplit8k.

(是的,我意识到这或多或少只是一个链接的答案,但是,将杰夫的解决方案粘贴在这里实际上是抄袭).

如果您要使用 Jeff 的解决方案,那么您将能够执行以下操作:

If you were to use Jeff's solution, then you would be able to do something like:

SELECT *
FROM dbo.DelimitedSplit8K('a,b,c,d,e,f,g,h,i,j,k',',') DS
WHERE ItemNumber = 2;

当然,您可能会传递列而不是文字字符串.

Of course, you'd likely be passing column rather than a literal string.

这篇关于SQL Server 2016 中 STRING_SPLIT 位置的返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆