任何人都可以帮助我,我对如何获得以下数据结果有疑问。参考下面的样本数据。所以这个的逻辑首先是我要删除数字前的字母,如果我得到同样的事情继续,我会删除字母前面的数字,这样我就可以得到我想要的结果。
表:
SALV3000640PIX32BLU
SALV3334470A9CARBONGRY
TP3000620PIXL128BLK
期望的输出:
PIX32BLU
A9CARBONGRY
PIXL128BLK
答案 0 :(得分:4)
您需要结合使用SUBSTRING
和PATINDEX
功能
SELECT
SUBSTRING(SUBSTRING(fielda,PATINDEX('%[^a-z]%',fielda),99),PATINDEX('%[^0-9]%',SUBSTRING(fielda,PATINDEX('%[^a-z]%',fielda),99)),99) AS youroutput
FROM yourtable
输入
yourtable
fielda
SALV3000640PIX32BLU
SALV3334470A9CARBONGRY
TP3000620PIXL128BLK
输出
youroutput
PIX32BLU
A9CARBONGRY
PIXL128BLK
答案 1 :(得分:1)
要执行此操作,您可以使用
PATINDEX('%[0-9]%',FieldName)
它将为您提供第一个数字的位置,然后使用SUBSTRING或其他字符串函数修剪此前的任何字母。 (在继续下一步之前,您需要修剪掉第一个字母,因为与CHARINDEX不同,PATINDEX函数中没有起点参数。)
然后在剩下的字符串上使用
PATINDEX('%[a-z]%',FieldName)
找到剩余字符串中第一个字母的位置。现在使用SUBSTRING等修剪前面的数字。
您可能会发现此其他解决方案很有用
答案 2 :(得分:0)
试试这可能会对你有所帮助
;With cte (Data)
AS
(
SELECT 'SALV3000640PIX32BLU' UNION ALL
SELECT 'SALV3334470A9CARBONGRY' UNION ALL
SELECT 'SALV3334470A9CARBONGRY' UNION ALL
SELECT 'SALV3334470B9CARBONGRY' UNION ALL
SELECT 'SALV3334470D9CARBONGRY' UNION ALL
SELECT 'TP3000620PIXL128BLK'
)
SELECT * , CASE WHEN CHARINDEX('PIX',Data)>0 THEN SUBSTRING(Data,CHARINDEX('PIX',Data),LEN(Data))
WHEN CHARINDEX('A9C',Data)>0 THEN SUBSTRING(Data,CHARINDEX('A9C',Data),LEN(Data))
ELSE NULL END AS DesiredResult FROM cte
结果
Data DesiredResult
-------------------------------------
SALV3000640PIX32BLU PIX32BLU
SALV3334470A9CARBONGRY A9CARBONGRY
SALV3334470A9CARBONGRY A9CARBONGRY
SALV3334470B9CARBONGRY NULL
SALV3334470D9CARBONGRY NULL
TP3000620PIXL128BLK PIXL128BLK