SQL 提取数字及其小数变化的查询
SQL query to extract a number and its decimal variations
我有包含各种数字的列,我特别想提取具有
555
或
555.xx
或
555.x
输出应如下所示
555
555.1
555.5
555.9
555.58
555.22
.
.
IE 我需要一个 sql 查询,它将 return 仅包含数字 555 的行以及来自我的任意数字列的任何小数部分。
作为一种快速的方法,我会这样做
CAST((ValueOfTable * 100.00) AS DECIMAL(18, 2))
my table name is Diagnosis and the column name is code, where should I
add the table name and column name in this code ?
你的情况:
SELECT
CAST((code * 100.00) AS DECIMAL(18, 2))
FROM Diagnosis ;
我希望这是一个整数。执行可以发现:
\d Diagnosis ;
输出行之一应该类似于
(...)
code | integer |
(...)
假设该列包含数字(不是 string/varchar),搜索 "number>=555 and number<556"。这会给你 555、555.01...等等
如果 CODE 列是一个 varchar(我认为它来自您的评论,但您可能想在问题正文中澄清这一点),并且 can/does 包含不是数字的值,那么你必须非常小心地使用只接受数字的函数。
通过此示例数据,您可以看到如果有一个值无法转换为数字,则会导致整个查询出错。
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 扩展工具包中的 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 中,但是在您使用之前都需要由您的管理员安装。在每种情况下,这对管理员来说都是一项简单的任务,尽管他们可能不知道自己的可用性。
你可以试试LIKE
语句
WHERE Col LIKE '555.%'
OR Col = '555'
我有包含各种数字的列,我特别想提取具有
555
或
555.xx
或
555.x
输出应如下所示
555
555.1
555.5
555.9
555.58
555.22
.
.
IE 我需要一个 sql 查询,它将 return 仅包含数字 555 的行以及来自我的任意数字列的任何小数部分。
作为一种快速的方法,我会这样做
CAST((ValueOfTable * 100.00) AS DECIMAL(18, 2))
my table name is Diagnosis and the column name is code, where should I add the table name and column name in this code ?
你的情况:
SELECT
CAST((code * 100.00) AS DECIMAL(18, 2))
FROM Diagnosis ;
我希望这是一个整数。执行可以发现:
\d Diagnosis ;
输出行之一应该类似于
(...)
code | integer |
(...)
假设该列包含数字(不是 string/varchar),搜索 "number>=555 and number<556"。这会给你 555、555.01...等等
如果 CODE 列是一个 varchar(我认为它来自您的评论,但您可能想在问题正文中澄清这一点),并且 can/does 包含不是数字的值,那么你必须非常小心地使用只接受数字的函数。
通过此示例数据,您可以看到如果有一个值无法转换为数字,则会导致整个查询出错。
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 扩展工具包中的 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 中,但是在您使用之前都需要由您的管理员安装。在每种情况下,这对管理员来说都是一项简单的任务,尽管他们可能不知道自己的可用性。
你可以试试LIKE
语句
WHERE Col LIKE '555.%'
OR Col = '555'