首页 > 解决方案 > 有没有办法在 SQL Server 中拆分列以提取“-”之后的文本?

问题描述

我知道人们以前以其他方式问过这个问题,但我对通过变量推送单个字符串不感兴趣。

我有一列包含以下数据:QWERTYUIOP-1、QWERTYUIOP-XL、ASDFG-2、HGJFK-SM。该列称为产品。我需要能够在“-”之后提取文本,以便将其作为大小存储在另一列中。对于这个例子,让我们调用表产品。

如何在 SQL Server 中做到这一点?在 postgreSQL 中使用 split_part 非常简单,但除了 string_split 之外似乎没有类似的函数,并且仅适用于表。当我尝试对列使用它时,它说 string_split 不存在。

有人可以帮我解决这个问题吗?

标签: sql-serverstringtext-extraction

解决方案


一种方法是用于STUFF删除前导字符,并用于CHARINDEX查找这些前导字符的结束位置:

SELECT V.YourString,
       STUFF(V.YourString,1,CHARINDEX('-',V.YourString),'') AS TrailingCharacters
FROM (VALUES('QWERTYUIOP-1'),('QWERTYUIOP-XL'),('ASDFG-2'),('HGJFK-SM'))V(YourString)

好的,现在球门柱已经移动了。您可以修改上述内容以获取最后一个-字符的位置REVERSE

SELECT V.YourString,
       STUFF(V.YourString,1,LEN(V.YourString) - CHARINDEX('-',REVERSE(V.YourString))+1,'') AS TrailingCharacters
FROM (VALUES('QWERTYUIOP-1'),('QWERTYUIOP-XL'),('ASDFG-2'),('HGJFK-SM'),('QWER-WETT-EWT-1'))V(YourString)

或者,您可以使用类似的字符串拆分器DelimitedSplit8k_LEAD并获取“最后”行:

WITH CTE AS(
    SELECT V.YourString,
           DS.ItemNumber,
           DS.Item,
           ROW_NUMBER() OVER (PARTITION BY V.YourString ORDER BY DS.ItemNumber DESC) AS RN
    FROM (VALUES('QWERTYUIOP-1'),('QWERTYUIOP-XL'),('ASDFG-2'),('HGJFK-SM'),('QWER-WETT-EWT-1'))V(YourString)
         CROSS APPLY dbo.DelimitedSplit8K(V.YourString,'-') DS)
SELECT YourString,
       DS.Item
FROM CTE
WHERE RN = 1;

推荐阅读