我试图从一个字符串中提取一些值,但我似乎无法使它工作。
SELECT
P.NOME
,ISNULL(SUM(VPL.QTD),0) as TQTD
,CAST(LEFT(SUBSTRING(P.NOME, PATINDEX('%[0-9]%', P.NOME), LEN(P.NOME)),2) AS INT)
,SUM(CAST(LEFT(SUBSTRING(P.NOME, PATINDEX('%[0-9]%', P.NOME), LEN(P.NOME)),2) AS INT)) * ISNULL(SUM(VPL.QTD),0)
FROM Tabela1 as P
GROUP BY P.NOME
如果我评论SUM,我得到这个:
但是当我尝试将CAST和VPL.QTD相加时,我得到了这个:
"Conversion failed when converting the varchar value 'Ga' to data type int."
此外,此子字符串SUBSTRING(P.NOME, PATINDEX('%[0-9]%', P.NOME), LEN(P.NOME)
会返回13 kgs
我正在使用Microsoft Sql Server
答案 0 :(得分:2)
显然,您有一个值,其中整数后面没有另一个整数。一种可能性是改变模式:
SUM(CONVERT(INT,
LEFT(SUBSTRING(P.NOME, PATINDEX('%[0-9][0-9]%', P.NOME), LEN(P.NOME)), 2)
)
) * ISNULL(SUM(VPL.QTD),0)
如果您使用的是SQL Server 2012+,则另一种方法是使用try_convert()
:
SUM(TRY_CONVERT(INT,
LEFT(SUBSTRING(P.NOME, PATINDEX('%[0-9]%', P.NOME), LEN(P.NOME)), 2)
)
) * ISNULL(SUM(VPL.QTD),0)
您也可以尝试CASE
语句,但我认为如果所有名称总是有两个相邻数字,则更改模式是更好的解决方案:
SUM(CASE WHEN P.NOME LIKE '%[0-9][0-9]%'
THEN CONVERT(INT,
LEFT(SUBSTRING(P.NOME, PATINDEX('%[0-9][0-9]%', P.NOME), LEN(P.NOME)), 2)
)
END
) * ISNULL(SUM(VPL.QTD),0)