首页 > 解决方案 > 为什么 SQL 浮点转换为字符串不能与 LIKE 一起使用,但 SQL 浮点转换为十进制转换为字符串可以?

问题描述

我有一个带有多个 type 的对象float,我很好奇为什么下面的 SQL 语句不起作用,但它下面的那个却起作用。

SELECT TOP (1000) [number]
FROM [object]
WHERE CONVERT(varchar(255), number) LIKE '%201608147%'

结果“找到 0 行”。

SELECT TOP (1000) [number]
FROM [object]
WHERE CONVERT(varchar(255), CONVERT(decimal(20, 2), number)) LIKE '%201608147%'

找到 1 行结果

编辑:我被要求执行以下操作:

SELECT
    number, 
    CONVERT(varchar(255), number), 
    CONVERT(varchar(255), CONVERT(decimal(20, 2), number))  
FROM [object]

这产生了以下结果:

number : 201608147  
number cast to string: 201608147  
number cast to decimal: 201608147.00

为了表明它确实是一个浮点数:

在此处输入图像描述

标签: sqlsql-server

解决方案


仿真后发现如下:

select nbr, Convert(varchar(255), nbr), Convert(varchar(255), Convert(decimal(20,2), nbr))  from tbl_XYZ

201608147   2.01608e+008    201608147.00

以字符串值的Convert(varchar(255), nbr)形式返回手头数字的科学记数法;因此该值与您的模式不匹配:

LIKE '%201608147%' 

此行为背后的原因是FloatDataType 用于保存数字的二进制(以 2 为底)近似值,而不是精确的十进制值。

浮点数通常以科学计数法显示。当范围比绝对精度更重要时,使用这些类型。这些数字在其他格式中很快变得笨拙。科学记数法也有助于强调有限的精度。在此示例中,您可以看到不同函数可用于格式化浮点数的不同方式。

DECLARE @float float = 201608147;
SELECT TheNumber = @float;

SELECT  ConvertWithoutStyle = CONVERT(varchar(255),@float),
        ConvertWithStyle0   = CONVERT(varchar(255),@float,0),
        ConvertWithStyle1   = CONVERT(varchar(255),@float,1),
        ConvertWithStyle2   = CONVERT(varchar(255),@float,2),
        ConvertWithStyle3   = CONVERT(varchar(255),@float,3);

对于浮点数,样式可以具有如下所示的值之一。其他值被处理为 0。

Value   Output
0 (default) A maximum of 6 digits. Use in scientific notation, when appropriate.
1   Always 8 digits. Always use in scientific notation.
2   Always 16 digits. Always use in scientific notation.
3   Always 17 digits. Use for lossless conversion. With this style, every distinct float or real value is guaranteed to convert to a distinct character string.

您正在使用从floatto的隐式转换varchar(255),它隐式使用 style 0。您的浮点数超过六位数,因此它以科学计数法表示。

您可能想改用 STR 或 FORMAT。


推荐阅读