由于您的值是字母数字代码,因此任何转换为数字类型的方法都将失败。
这是我的建议:
DECLARE @YourJSON NVARCHAR(MAX)=N'{"Item1":"234-00945","Item2":"7512345671195.0","Item3":"5027501.0"}';
--如果需要,我们使用 aCASE
来测试最后的 2 个字符并删除它们:
SELECT CASE WHEN RIGHT(Item1,2)='.0' THEN SUBSTRING(Item1,1,LEN(Item1)-2) ELSE Item1 END AS Item1
,CASE WHEN RIGHT(Item2,2)='.0' THEN SUBSTRING(Item2,1,LEN(Item2)-2) ELSE Item2 END AS Item2
,CASE WHEN RIGHT(Item3,2)='.0' THEN SUBSTRING(Item3,1,LEN(Item3)-2) ELSE Item3 END AS Item3
FROM OPENJSON( @YourJSON )
WITH (Item1 NVARCHAR(100) '$.Item1'
,Item2 NVARCHAR(100) '$.Item2'
,Item3 NVARCHAR(100) '$.Item3'
);
任何尝试CAST
都会导致错误。
使用TRY_CAST
会起作用,但也可能会削减类似的东西.123
。
类似的事情123.6
会导致围捕并以124
.
暗示
一般来说,坚持正确的类型非常重要。您的代码是字符串,尽管其中一些看起来像数字......
UDATE:相同但没有重复的 CASE 表达式
您可以使用以下内容(或创建 UDF):
SELECT p.*
FROM
(
SELECT Cleaned.*
FROM OPENJSON( @YourJSON ) TheJsonItems
CROSS APPLY(SELECT TheJsonItems.[key]
,CASE WHEN RIGHT(TheJsonItems.[value],2)='.0'
THEN SUBSTRING(TheJsonItems.[value],1,LEN(TheJsonItems.[value])-2)
ELSE TheJsonItems.[value] END) Cleaned(ItemName,ItemValue)
) t
PIVOT(MAX(t.ItemValue) FOR t.ItemName IN(Item1,Item2,Item3)) p