FLOAT的“类似”问题:需要SQL查询才能找到> = 4个小数位的值

时间:2018-06-21 15:10:45

标签: sql sql-server sql-like

我有一个难题。...

有一张表,其中有一个 NVARCHAR(50) Float 列,其中包含许多行,其中包含许多不同十进制长度的数字:

  • '3304.063'
  • '3304.0625'
  • '39 .53'
  • “ 39.2”

我需要编写查询以仅查找小数位数> = 4的数字

首先,我写的查询是:

SELECT
     Column
FROM Tablename
WHERE Column LIKE '%.[0-9][0-9]%'

上面的代码查找所有带小数位数> = 2的数字:

  • '3304.063'
  • '3304.0625'
  • '39 .53'

完美!现在,我只需要将[0-9]增加2 ...

SELECT
     Column
FROM Tablename
WHERE Column LIKE '%.[0-9][0-9][0-9][0-9]%'

这什么也没返回!什么?

有人对什么地方也出了什么问题和/或可能的解决方案有任何解释吗?我有些沮丧,我的直觉是这是某种“喜欢”的限制。

任何帮助将不胜感激! 谢谢。

4 个答案:

答案 0 :(得分:2)

编辑后,您说过您正在使用FLOAT,它是存储为4或8字节或7或15位精度的近似值。这些文档明确声明并非可以准确表示数据类型范围内的所有值。它还指出,您可以在转换时使用STR()函数,以正确设置格式。方法如下:

declare @table table (columnName float)

insert into @table
values
('3304.063'),
('3304.0625'), 
('39.53'),
('39.2')


--see the conversion
select * , str(columnName,20,4)
from @table

--now use it in a where clause. 
--Return all values where the last digit isn't 0 from STR() the conversion
select  *
from @table
where right(str(columnName,20,4),1) != 0

旧答案

您的LIKE语句可以完成操作,这是另一种显示它们都起作用的方法。

declare @table table (columnName varchar(64))

insert into @table
values
('3304.063'),
('3304.0625'),
('39.53'),
('39.2')

select *
from @table
where len(right(columnName,len(columnName) - charindex('.',columnName))) >= 4

select *
from @table
where columnName like '%.[0-9][0-9][0-9][0-9]%'

可能导致此问题的原因是某个地方的数字有空格...因为您说列类型为VARCHAR,所以这是有可能的,可以通过将值存储为{{1}来避免}

DECIMAL

如何确定是否是这种情况?

declare @table table (columnName varchar(64))

insert into @table
values
('3304.063'),
('3304. 0625'), --notice the space here
('39.53'),
('39.2')

--this would return nothing
select *
from @table
where columnName like '%.[0-9][0-9][0-9][0-9]%'

或者,除了数字和小数点之外的任何东西:

select *
from @table
where columnName like '% %'

答案 1 :(得分:0)

以下对我来说很好:

declare @tab table (val varchar(50))
insert into @tab 
select '3304.063'
union select '3304.0625'
union select '39.53'
union select '39.2'

select * from @tab
where val like '%.[0-9][0-9][0-9][0-9]%'

答案 2 :(得分:0)

假设您的表格仅包含数字数据,则可以将其转换为十进制,然后进行比较:

SELECT COLUMN 
FROM tablename 
WHERE CAST(COLUMN AS DECIMAL(19,4)) <> CAST(COLUMN AS DECIMAL(19,3))

您要对照其他人已经提出的字符数据类型解决方案来测试其性能。

答案 3 :(得分:0)

您可以使用REVERSE:

declare @vals table ([Val] nvarchar(50))
insert into @vals values ('3304.063'), ('3304.0625'), ('39.53'), ('39.2')

select [Val]
from @Vals
where charindex('.',reverse([Val]))>4