【问题标题】:SQL Substring separation throws conversion errorSQL 子串分离引发转换错误
【发布时间】:2017-11-16 03:09:02
【问题描述】:

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

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 数据类型。

我确定我错过了一些非常简单的东西......有人愿意开导吗?

【问题讨论】:

  • 你有表达式MEMO - CHARINDEX(',',REVERSE(MEMO))。没有意义。

标签: sql sql-server substring


【解决方案1】:

试试下面的查询

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

【讨论】:

  • @Matt 不,我只是更改了语法以避免转换错误。使用最新的查询,我已经尝试过,它只给出 4 位数字。
  • 是的,这行得通,谢谢 Nandish。我对我的要求做了一些更改。选择 MEMO_TYPE = 'CREDCARD' 然后 SUBSTRING(MEMO, CHARINDEX(',', MEMO)+1, LEN(MEMO)-CHARINDEX(',', MEMO) -CHARINDEX(', ',REVERSE(MEMO))) ELSE null END as CardNumber From REV
【解决方案2】:

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

【讨论】:

  • @Dev:你说得对,现在我改为 LEN(MEMO) - (CHARINDEX(',', MEMO)-CHARINDEX(',',REVERSE(MEMO))-6)) 和它有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
相关资源
最近更新 更多