一种方法是使用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;