1

我想从“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'    
        );

请建议。

样本数据:

  • 项目 1:'234-00945'
  • 项目2:'7512345671195.0'

  • 项目 3:'5027501.0'

4

3 回答 3

1

您可以尝试使用强制转换为 INT

         SELECT CAST (your_value AS INT)
         ....

如果你需要字符串

         SELECT CAST(CAST(your_value AS INT)  AS  NVARCHAR(100))
         ....
于 2019-08-27T07:26:18.537 回答
1

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

这是我的建议:

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
于 2019-08-27T08:23:42.167 回答
0

不要从 中删除它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

于 2019-08-27T07:33:46.340 回答