用于提取数字及其十进制变化的 SQL 查询 [关闭]
Posted
技术标签:
【中文标题】用于提取数字及其十进制变化的 SQL 查询 [关闭]【英文标题】:SQL query to extract a number and its decimal variations [closed] 【发布时间】:2015-05-11 23:36:03 【问题描述】:我有一列包含各种数字的列,我专门尝试提取具有以下任一数字的数字
555
或
555.xx
或
555.x
输出应该是这样的
555
555.1
555.5
555.9
555.58
555.22
.
.
IE 我需要一个 sql 查询,它将从我的任意数字列中返回只有数字 555 和任何小数的行。
【问题讨论】:
列的类型是什么?您能否发布一些示例数据以及您希望返回的内容? @AbeMiessler,不确定如何检查我正在处理的列类型,但我更新了我希望输出的外观。 我没有看到任何更新。 Googlehow to check SQL Server column type
- 如果您想要正确答案,这是必需的信息。
@AbeMiessler 是一个 select CHARACTER VARYING(10) 类型的列
您使用的是哪个 DBMS?后格雷斯?甲骨文?
【参考方案1】:
你可以试试LIKE
声明
WHERE Col LIKE '555.%'
OR Col = '555'
【讨论】:
@sqkuser,这行得通【参考方案2】:作为一种快速的方法,我会这样做
CAST((ValueOfTable * 100.00) AS DECIMAL(18, 2))
我的表名是诊断,列名是代码,我应该在哪里 在此代码中添加表名和列名?
在你的情况下:
SELECT
CAST((code * 100.00) AS DECIMAL(18, 2))
FROM Diagnosis ;
我希望这是一个整数。你可以找出执行:
\d Diagnosis ;
其中一个输出行应该类似于
(...)
code | integer |
(...)
【讨论】:
我的表名是Diagnosis,列名是code,这个code中的表名和列名应该加在哪里?【参考方案3】:假设列包含数字(不是字符串/varchar),搜索“number>=555 and number
【讨论】:
@Micheal,我正在处理的列包含除特殊字符外的所有类型的字符和数字,因此列类型是字符。【参考方案4】:如果 CODE 列是 varchar(我理解它来自您的 cmets,但您可能希望在问题主体本身中澄清这一点),并且可以/确实包含不是数字的值,那么您必须是使用只接受数字的函数时要非常小心。
通过此示例数据,您可以看到,如果有一个值不能转换为数字,则会导致整个查询出错。
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 中,但都需要管理员安装才能使用它们。在每种情况下,这对管理员来说都是一项简单的任务,尽管他们可能不知道自己的可用性。
【讨论】:
我试过这个并得到一个错误`错误:函数'ISNUMBER(VARCHAR)'不存在,无法识别满足给定参数类型的函数。您可能需要添加显式类型转换 ` 这两个功能都需要由您的管理员明确提供给您。两者都随系统提供,但必须安装/配置以上是关于用于提取数字及其十进制变化的 SQL 查询 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SQL 查询中的 CREATE/UPDATE/INSERT 语句中提取表名?
如果我为我的表命名,为啥 SQL 查询顺序会发生变化? [关闭]