我有各种数字的专栏,我特意尝试提取具有
的数字555
或
555.xx
或
555.x
输出应该如下所示
555
555.1
555.5
555.9
555.58
555.22
.
.
IE我需要一个sql查询,它将返回具有数字555的行,其中包含来自任意数字列的任何小数部分。
答案 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'