SQL Server 如何拆分两个不同列的多值,并将一列的拆分值与另一列的拆分值进行对比显示?

icnyk63a  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(138)

我有两个专栏,内容如下:
| 还款_数量|还款_参照|
| - ------|- ------|
| 一百五十点零六至三千八百二十九点零七|第21季度第1 P-20210529期第21季度第20210428期|
| 一百六十点一二至一千六百五十至二千四百二十九点四九|第21号药品|
| 一百一十五点九至一百零四点二八至二千六百至一千四百六十一点四七|通21 JK 9 -20210731通21 JG 1 -20210731通21 QZP-20210724通21 YMG-20210628|
Repay_Amount具有由Unicode字符分隔的一些量。
Repay_Ref也有一些用分隔的值,但是,如果您注意到,每个单元格中的每个多值都以日期结尾。
我只想显示Repay_Ref的日期和对应的Repay_Amount金额。
我想要达到的是:
| 还款_数量|还款_参照|
| - ------|- ------|
| 一百五十点零六分|小行星20210529|
| 小行星3829.07|小行星20210428|
| 一百六十点一二分|小行星20210628|
| 小行星1650|小行星20210531|
| 小行星2429.49|小行星20210529|
| 一百一十五点九|小行星2021|
| 一○四点二八分|小行星2021|
| 小行星2600|小行星20210724|
| 小行星1461.47|小行星20210628|
我尝试了以下查询,但无法获得所需结果。存在重复。

SELECT      REPAY_AMOUNT,
            RA.Value AS [SPLIT_REPAY_AMOUNT],
            RR.Value AS [SPLIT_REPAY_ref],
            REPAY_ref
FROM        InsightImport.dbo.AA_BILL_DETAILS bil
CROSS APPLY STRING_SPLIT(REPAY_AMOUNT, N'') RA
CROSS APPLY STRING_SPLIT(REPAY_ref, N'') RR

任何帮助都将不胜感激!

cvxl0en2

cvxl0en21#

您需要一个拆分器函数,该函数返回每个子字符串的序号位置。从SQL Server 2022开始,STRING_SPLIT()支持可选的enable_ordinal参数。
对于早期版本,可以选择基于JSON的方法。其思想是将存储的文本转换为有效的JSON数组(115.9104.2826001461.47转换为["115.9","104.28","2600","1461.47"]),并使用OPENJSON()和默认方案解析此数组。结果是一个包含keyvaluetype列的表,key列保存指定数组中元素的索引。

SQL服务器2022:

SELECT RA.[value] AS [SPLIT_REPAY_AMOUNT], RR.[value] AS [SPLIT_REPAY_ref]
FROM AA_BILL_DETAILS
CROSS APPLY STRING_SPLIT(REPAY_AMOUNT, N'', 1) RA
CROSS APPLY STRING_SPLIT(REPAY_ref, N'', 1) RR
WHERE RA.[ordinal] = RR.[ordinal]

SQL Server 2016及更高版本:

SELECT RA.[value] AS [SPLIT_REPAY_AMOUNT], RR.[value] AS [SPLIT_REPAY_ref]
FROM AA_BILL_DETAILS
CROSS APPLY OPENJSON(CONCAT('["', REPLACE(REPAY_AMOUNT, N'', '","'), '"]')) RA
CROSS APPLY OPENJSON(CONCAT('["', REPLACE(REPAY_REF, N'', '","'), '"]')) RR
WHERE RA.[key] = RR.[key]

相关问题