SQL查询提取数字及其小数变化

时间:2015-05-11 23:36:03

标签: sql netezza

我有各种数字的专栏,我特意尝试提取具有

的数字
555

555.xx

555.x

输出应该如下所示

555
555.1
555.5
555.9
555.58
555.22
.
.

IE我需要一个sql查询,它将返回具有数字555的行,其中包含来自任意数字列的任何小数部分。

4 个答案:

答案 0 :(得分:1)

作为一种快速的方法我会做

CAST((ValueOfTable * 100.00) AS DECIMAL(18, 2)) 
  

我的表名是Diagn,列名是代码,我应该在哪里   在此代码中添加表名和列名?

在你的情况下:

SELECT
CAST((code * 100.00) AS DECIMAL(18, 2)) 
FROM Diagnosis ;

我希望这是一个整数。你可以找到执行:

\d Diagnosis ; 

其中一个输出行应该类似于

 (...)
 code                       | integer                     | 
 (...)

答案 1 :(得分:1)

假设该列包含数字(而不是字符串/ varchar),请搜索“number&gt; = 555且数字<556”。这会给你555,555.01 ......等等。

答案 2 :(得分:1)

如果CODE列是varchar(我理解它来自你的评论,但你可能想在问题正文中澄清),并且可以/确实包含不是数字的值,那么你必须是非常小心使用只接受数字的函数。

使用此示例数据,您可以看到有一个值无法转换为数字将导致整个查询出错。

select * from diagnosis order by code;
   CODE
-----------
 555
 555.0
 555.43
 555.99
 Not a Num
(5 rows)

select code + 1 from diagnosis;
ERROR:  pg_atoi: error in "Not a Num": can't parse "Not a Num"

通常的解决方法是通过正则表达式匹配列值,或者使用函数来测试每行中的值是否为数字。

以下是两个解决方案,每个解决方案都依赖于Netezza提供的功能,但默认情况下不一定安装。您的管理员可以为您安装这些。

第一个使用SQL Extension Toolkit中的regexp_instr。在这里,您使用正则表达式来匹配您想要的值,而无需对数字执行实际的CAST(隐式或显式)。

SELECT code FROM diagnosis
WHERE regexp_instr(code, '^555(\.\d+)?$') > 0;

  CODE
--------
 555
 555.0
 555.43
 555.99
(4 rows)

第二个解决方案,涉及更多,使用作为Netezza InDatabase Analytics包的一部分提供的isnumeric()UDF(安装时在/ nz / extensions / nz / nzlua / examples目录中),以测试是否在将CODE转换为数字之前,CODE列是一个数字。

SELECT code
FROM (
      SELECT code
      FROM diagnosis
      WHERE isnumber(code)
   )
   foo
WHERE floor(code::NUMERIC(38,2)) = 555;

  CODE
--------
 555
 555.0
 555.43
 555.99
(4 rows)

这两个功能都是包含与Netezza,但两者都需要管理员安装才能使用它们。在每种情况下,这对管理员来说都是一项简单的任务,尽管他们可能不知道他们的可用性。

答案 3 :(得分:1)

您可以尝试LIKE声明

WHERE Col LIKE '555.%'
OR Col = '555'