代码之家  ›  专栏  ›  技术社区  ›  rs.

SQL Server-强制转换和拆分

  •  1
  • rs.  · 技术社区  · 16 年前
    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 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 不会分割值。

    它在小数点后给了我更多的零,而不是除数。(我甚至把它放在括号里,尝试了同样的结果)。

    Ex:2000/1000 = 2000.000000
    

    我在这里做错什么了吗?patindex表达式参数是否正确?

    Expected result:
    4.000
    3.123
    7.000
    80.000
    

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

    4 回复  |  直到 16 年前
        1
  •  1
  •   CResults    16 年前

    试试这个…

    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
    

    产量

    4.00000000000
    3.12300000000
    0.00700000000
    80.00000000000
    NULL
    NULL
    

    编辑-在输出中保留3个小数位

    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)

        2
  •  1
  •   KM.    16 年前

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

    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
    

    输出:

    ---------------------------------------
    4000.000
    3.123
    7.000
    80000.000
    NULL
    
    (5 row(s) affected)
    
        3
  •  0
  •   Nate Heinrich    16 年前

    除以1000会在小数点后给你更多的零

    5.3 / 1000 = .0053
    
        4
  •  0
  •   HLGEM    16 年前
    select xyz, ((case when charindex('.', xyz) > 0 then cast(xyz AS decimal(18,3))*1000
                       else cast(xyz AS decimal(18,3)) end))/1000
    from #table
    
    推荐文章