首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server - CAST和DIVIDE

SQL Server - CAST和DIVIDE
EN

Stack Overflow用户
提问于 2010-03-12 04:12:46
回答 4查看 2.4K关注 0票数 1
代码语言:javascript
复制
DECLARE @table table(XYZ VARCHAR(8) , id int)

INSERT INTO @table
SELECT '4000', 1
UNION ALL
SELECT '3.123', 2
UNION ALL
SELECT '7.0', 3
UNION ALL
SELECT '80000', 4
UNION ALL
SELECT NULL, 5

查询:

代码语言:javascript
复制
SELECT CASE 
         WHEN PATINDEX('^[0-9]{1,5}[\.][0-9]{1,3}$', XYZ) = 0 THEN XYZ
         WHEN PATINDEX('^[0-9]{1,8}$',XYZ) = 0 THEN CAST(XYZ AS decimal(18,3))/1000
         ELSE NULL 
       END
  FROM @table

这部分- CAST(XYZ AS decimal(18,3))/1000没有除值。

它给了我更多的小数后的零数,而不是除以它。(我甚至将其括在括号中,并尝试了相同的结果)。

代码语言:javascript
复制
Ex:2000/1000 = 2000.000000

我是不是做错了什么?patindex表达式参数是否正确?

代码语言:javascript
复制
Expected result:
4.000
3.123
7.000
80.000

如果PATINDEX不是正确的使用方法,请告诉我?我试着检查它是否已经是带有3个小数点的小数,否则我想除以1000。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-12 04:45:10

试试这个..。

代码语言:javascript
复制
DECLARE @table table(XYZ VARCHAR(8) , id int)

INSERT INTO @table
SELECT '4000', 1
UNION ALL
SELECT '3.123', 2
UNION ALL
SELECT '7.0', 3
UNION ALL
SELECT '80000', 4
UNION ALL
SELECT NULL, 5
UNION ALL
SELECT 'WTF',6

SELECT CASE 
     WHEN ISNUMERIC(XYZ) = 0 THEN NULL
     WHEN CHARINDEX('.',XYZ,0) < LEN(XYZ)-2 AND CHARINDEX('.',XYZ,0) > 0 THEN XYZ
     WHEN ISNUMERIC(XYZ) >0  then  convert(decimal(18,3),xyz) / 1000.000
     ELSE NULL
END
  FROM @table

输出

代码语言:javascript
复制
4.00000000000
3.12300000000
0.00700000000
80.00000000000
NULL
NULL

编辑-要在输出中保留3位小数,请执行以下操作

代码语言:javascript
复制
SELECT convert(decimal(8,3),CASE 
     WHEN ISNUMERIC(XYZ) = 0 THEN NULL
     WHEN CHARINDEX('.',XYZ,0) < LEN(XYZ)-2 AND CHARINDEX('.',XYZ,0) > 0 THEN XYZ
     WHEN ISNUMERIC(XYZ) >0  then  convert(decimal(18,3),xyz) / 1000.000
     ELSE NULL
END)
  FROM @table

请注意,(8,3)定义了这一点,总精度为8位,点后为3位。

您可能也希望转换回varchar(8)

票数 1
EN

Stack Overflow用户

发布于 2010-03-12 04:23:16

尝试此操作,将整个大小写转换为十进制(18,3):

代码语言:javascript
复制
DECLARE @table table(XYZ VARCHAR(8) , id int)

INSERT INTO @table
SELECT '4000', 1
UNION ALL
SELECT '3.123', 2
UNION ALL
SELECT '7.0', 3
UNION ALL
SELECT '80000', 4
UNION ALL
SELECT NULL, 5


SELECT CONVERT(decimal(18,3),CASE --nothing changes within the CASE
                                 WHEN PATINDEX('^[0-9]{1,5}[\.][0-9]{1,3}$', XYZ) = 0 THEN XYZ
                                 WHEN PATINDEX('^[0-9]{1,8}$',XYZ) = 0 THEN CAST(XYZ AS decimal(18,3))/1000
                                 ELSE NULL 
                             END
              )
FROM @table

输出:

代码语言:javascript
复制
---------------------------------------
4000.000
3.123
7.000
80000.000
NULL

(5 row(s) affected)
票数 1
EN

Stack Overflow用户

发布于 2010-03-12 04:20:22

除以1000会得到小数点后的更多零

代码语言:javascript
复制
5.3 / 1000 = .0053
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2428312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档