连接&修剪字符串

时间:2017-07-26 09:37:23

标签: sql sql-server

任何人都可以帮助我,我对如何获得以下数据结果有疑问。参考下面的样本数据。所以这个的逻辑首先是我要删除数字前的字母,如果我得到同样的事情继续,我会删除字母前面的数字,这样我就可以得到我想要的结果。

表:

SALV3000640PIX32BLU
SALV3334470A9CARBONGRY
TP3000620PIXL128BLK

期望的输出:

PIX32BLU
A9CARBONGRY
PIXL128BLK

3 个答案:

答案 0 :(得分:4)

您需要结合使用SUBSTRINGPATINDEX功能

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

SQL小提琴:http://sqlfiddle.com/#!6/5722b6/29/0

答案 1 :(得分:1)

要执行此操作,您可以使用

PATINDEX('%[0-9]%',FieldName) 

它将为您提供第一个数字的位置,然后使用SUBSTRING或其他字符串函数修剪此前的任何字母。 (在继续下一步之前,您需要修剪掉第一个字母,因为与CHARINDEX不同,PATINDEX函数中没有起点参数。)

然后在剩下的字符串上使用

PATINDEX('%[a-z]%',FieldName)

找到剩余字符串中第一个字母的位置。现在使用SUBSTRING等修剪前面的数字。

您可能会发现此其他解决方案很有用

SQL to find first non-numeric character in a string

答案 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