我有一个名为Custom#5的nvarchar列表,它包含以下数据。
row number Custom#5
1 267.5
2 tbc
3
4 34
我希望能够清理这些数据,因此总是返回一个数值。
row number Custom#5
1 267.5
2 0
3 0
4 34
我当前的查询是;
SELECT CASE
WHEN BomHeaders_1.Custom#5 NOT LIKE '%[^0-9]%'
THEN 0
WHEN BomHeaders_1.Custom#5 IS NULL
THEN 0
ELSE BomHeaders_1.Custom#5
END AS Custom5
FROM [FS25-W2K8\SQLEXPRESS].sagel50_46772.dbo.BomHeaders AS BomHeaders_1
INNER JOIN [FS25-W2K8\SQLEXPRESS].sagel50_46772.dbo.BomComponents AS BomComponents_1 ON BomHeaders_1.ID = BomComponents_1.HeaderID
INNER JOIN [FS25-W2K8\SQLEXPRESS].sagel50_46772.dbo.BomHeaders AS BomHeaders_2 ON BomComponents_1.StockCode = BomHeaders_2.BomReference
INNER JOIN manu_STOCK ON BomHeaders_1.BomReference = manu_STOCK.STOCK_CODE
WHERE (BomComponents_1.StockCode LIKE N'21%')
我得到的当前错误是 “将nvarchar值'267.5'转换为数据类型int时转换失败。”
答案 0 :(得分:3)
如果您使用2012或更高版本,我会使用tryparse函数
join
答案 1 :(得分:0)
declare @t table (R INT,C varchar(10))
inSERT INTO @t(R,c)values (1,'267.5'),(2,'tbc'),(3,''),(4,'34')
select R,CASE WHEN C LIKE '%[^a-zA-Z]%' THEN C ELSE CAST(0 AS VARCHAR) END from @t
答案 2 :(得分:0)
如果你使用SQL Server< 2012年并没有使用try_parse的选项,您可以使用:
DECLARE @string nvarchar(255)
SET @string = 'Hali891236.5€hHalo'
SELECT Substring(
@string,
PATINDEX('%[0-9.]%',@string),
PATINDEX('%[^0-9.]%',
Substring(
@string,
PATINDEX(
'%[0-9.]%',
@string
),
LEN(@string)
)
)-1
)
GO