SQL Substring分隔会引发转换错误

时间:2017-11-16 03:09:03

标签: sql sql-server substring

我必须得到信用卡号的最后四位数,在通过子串函数分离后,结果会引发转换错误。下面是一个示例表

CREATE TABLE REV (MEMO varchar(100),MEMO_TYPE varchar(100))
INSERT REV VALUES ('09999D,xxxxxxxxxxxx0999,xx/xx,   30.27', 'CREDCARD')
INSERT REV VALUES ('09999D,xxxxxxxxxxxx0666,xx/xx,   50.45', 'CREDCARD')
INSERT REV VALUES ('09999D,REVVALS,ALC,   0', 'OTHER')

以下是使用的查询

Select CAST(case when MEMO_TYPE = 'CREDCARD' then  
SUBSTRING(MEMO, CHARINDEX(',', MEMO)+1, LEN(MEMO)
-CHARINDEX(',', MEMO-CHARINDEX(',',REVERSE(MEMO))-6)) ELSE null END
as varchar(100))
-- as Cardnumber)
From REV
它扔了     转换varchar值时转换失败     '09999D,xxxxxxxxxxxx0999,xx / xx,30.27'到数据类型int。

我确定我错过了一些非常简单的事情......任何人都在关心启发?

2 个答案:

答案 0 :(得分:0)

@Gordon是对的,你有MEMO - CHARINDEX(...)这是一个VARCHAR字段减去INT函数的结果,这会导致你看到转换失败的消息。

答案 1 :(得分:0)

尝试以下查询

Select 
case when MEMO_TYPE = 'CREDCARD' 
then SUBSTRING(MEMO, CHARINDEX(',', MEMO)+1, LEN(MEMO) - (CHARINDEX(',', MEMO)-CHARINDEX(',',REVERSE(MEMO))-6)) ELSE null END
From REV
抱歉,修复了以上查询的转换错误, 请使用以下查询获取4位数的卡号..

Select 
case when MEMO_TYPE = 'CREDCARD' 
then replace(SUBSTRING(MEMO,charindex(',',MEMO)+1,len(MEMO) - charindex(',',reverse(MEMO),CHARINDEX(',',reverse(MEMO))+1) - charindex(',',MEMO)),'x','') ELSE null END
From REV