我有一个难题。...
有一张表,其中有一个 NVARCHAR(50) Float 列,其中包含许多行,其中包含许多不同十进制长度的数字:
我需要编写查询以仅查找小数位数> = 4的数字
首先,我写的查询是:
SELECT
Column
FROM Tablename
WHERE Column LIKE '%.[0-9][0-9]%'
上面的代码查找所有带小数位数> = 2的数字:
完美!现在,我只需要将[0-9]增加2 ...
SELECT
Column
FROM Tablename
WHERE Column LIKE '%.[0-9][0-9][0-9][0-9]%'
这什么也没返回!什么?
有人对什么地方也出了什么问题和/或可能的解决方案有任何解释吗?我有些沮丧,我的直觉是这是某种“喜欢”的限制。
任何帮助将不胜感激! 谢谢。
答案 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