用于提取数字及其十进制变化的 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,不确定如何检查我正在处理的列类型,但我更新了我希望输出的外观。 我没有看到任何更新。 Google how 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 查询顺序会发生变化? [关闭]

全文搜索用于提取文本片段(返回预期文本及其周围)

将数据从 BigQuery 导入 SQL Server [关闭]

sql 用于提取审核跟踪数据的几个查询。

sql 提取第一个字符