如何从 SQL 中的 FROM OPENJSON( ) WITH 中的十进制值中删除 .0

How to remove .0 from decimal value in FROM OPENJSON( ) WITH in SQL

我想从“123.0”的值中删除 .0。

$.Item2 的实际值为“123.0”。我想将其转换为“123”,删除 .0

我试过如下但没有成功

 SELECT Item1,Item2,Item3
 FROM OPENJSON( @DataTable  )
 WITH (Item1 NVARCHAR(100) '$.Item1'
        , Item2 NVARCHAR(100) LEFT('$.Item2', CHARINDEX('.',  '$.Item2') - 1) 
        , Item3 NVARCHAR(100) '$.Item3'    
        );

请多多指教。

示例数据:

您可以尝试使用转换为 INT

         SELECT CAST (your_value AS INT)
         ....

of 如果你需要字符串

         SELECT CAST(CAST(your_value AS INT)  AS  NVARCHAR(100))
         ....

而不是从 charindex 中删除它,因为这个值是十进制的,所以直接将它转换为您的值的 bigint

 SELECT Item1,
case when Item2 like '%.0' then 
substring(Item2 , 1 , PATINDEX('%[^0-9]%', Item2) - 1) else Item2  end as Item2,
Item3    --- cast over here
 FROM OPENJSON( @DataTable  )
 WITH (Item1 NVARCHAR(100) '$.Item1'
        , Item2 NVARCHAR(100) '$.Item2'
        , Item3 NVARCHAR(100) '$.Item3'    
        );


For example---

Declare @query varchar(max) 

set @query = '7512345671195.00'

select substring(@query, 1 , PATINDEX('%[^0-9]%', @query)-1)


Result
-------
7512345671195

由于您的值是字母数字代码,因此任何转换为​​数字类型的方法都会失败。

这是我的建议:

DECLARE @YourJSON NVARCHAR(MAX)=N'{"Item1":"234-00945","Item2":"7512345671195.0","Item3":"5027501.0"}';

--我们使用CASE来测试最后的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