在我的表格中,我有一列(Varchar)。它包含类似“ abc ^ 1234567 ^ xyz”的值。 我需要选择值的一部分,并将其转换为数字,然后将其转换为十进制数字,然后通过将两个表连接起来,将该数字与另一个表中的数字进行比较。 到目前为止,我想将其从varchar转换为十进制时遇到错误。
这是我的错误消息: 消息8114,第16级,状态5,第1行 将数据类型varchar转换为数字时出错。 这是我的代码:
SELECT
a.Status,
Cast(SUBSTRING(sourceNatKey, LEN(sourceNatKey)-11,7) As Decimal(18,4)),
b.caseId
FROM AGREEMENT_STATUS a
INNER JOIN APPLICATION_FACT b
ON
Cast(SUBSTRING(sourceNatKey, LEN(sourceNatKey)-11,7) As decimal(18,4)) =
b.caseId
答案 0 :(得分:3)
在这种情况下,可以在JOIN中使用LIKE运算符。 但是,如果确实需要从这样的字符串中获取子字符串('abc ^ 1234567 ^ xyz'),则可以使用以下构造:
SELECT
a.Status,
Cast(SUBSTRING(sourceNatKey, CHARINDEX('^',sourceNatKey) + 1,CHARINDEX('^',sourceNatKey, CHARINDEX('^',sourceNatKey)+1) - CHARINDEX('^',sourceNatKey) - 1) As decimal(18,4)),
b.caseId
FROM AGREEMENT_STATUS a
INNER JOIN APPLICATION_FACT b
ON
Cast(SUBSTRING(sourceNatKey, CHARINDEX('^',sourceNatKey) + 1,CHARINDEX('^',sourceNatKey, CHARINDEX('^',sourceNatKey)+1) - CHARINDEX('^',sourceNatKey) - 1) As decimal(18,4)) =
b.caseID
答案 1 :(得分:1)
您可以通过其他方式执行此操作:
SELECT
a.Status,
b.caseId
FROM AGREEMENT_STATUS a JOIN
APPLICATION_FACT af
ON sourceNatKey LIKE '%^' + CAST(b.caseID as varchar(255)) + '^%'
caseId
列的第二栏中包含信息,因此无需重复。
答案 2 :(得分:0)
给定值SUBSTRING(sourceNatKey, LEN(sourceNatKey)-11,7)
,代码^123456
将导致abc^1234567^xyz
。之所以失败,是因为^
是非数字的。将LEN
调用中的偏移值更改为-10
,以便仅检索字符串的数字部分。
有关SUBSTRING
的更多信息,请参见SUBSTRING (Transact-SQL) Documentation。