如何从 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'
);
请多多指教。
示例数据:
- 项目 1:“234-00945”
项目 2:'7512345671195.0'
项目 3:'5027501.0'
您可以尝试使用转换为 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
我想从“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'
您可以尝试使用转换为 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