将varchar转换为Decimal

时间:2018-08-15 12:40:22

标签: sql sql-server

在我的表格中,我有一列(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

3 个答案:

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