【问题标题】:Mostly numeric range主要是数字范围
【发布时间】:2012-08-17 20:02:04
【问题描述】:

我在使用 ColdFusion 访问的 Oracle 数据库中有一个列,并且想要选择一系列项目。

该列主要是数字,但在数字末尾包含一些字母。 样本数据:55, 56, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 57A, 57, 580, 581, 582, 583, 583, 583, 584, 585, 586, , 587, 588, 589, 58, 59, ....

我想要

select .... where filenumber >= '57' and filenumber <= '59'

结果将返回 57、57A、58 和 59

该列的 Oracle 数据类型是 varchar。

【问题讨论】:

  • 所以,具体来说,您只需要数字为两位数的行(“输入”的长度),再加上任意数量的非数字字符?
  • 数字 57 可以是任意位数。有时文件拆分为多个文件,并在文件编号后附加 A、B、C...,我不希望这些字母从我的范围结果中排除这些文件。
  • 对不起;我的意思是,您只想包含 fileNumber 与您的输入标准具有相同位数(并且在给定范围内)的行。包含非数字数据的行只是“奖励”。
  • 是的,570 会被排除,但 57A 不会。

标签: sql oracle coldfusion


【解决方案1】:

您也许可以使用正则表达式来仅获取数字,如下所示:

SELECT ....
WHERE REGEXP_LIKE(filenumber, '^[[:digit:]]+$') >= '57'
AND REGEXP_LIKE(filenumber, '^[[:digit:]]+$') <= '59'

但是,我以前从未使用过 Oracle,所以这可能行不通。

基于this SO answer

另一个简化的尝试:

SELECT ....
WHERE REGEXP_LIKE(filenumber, '^[[:digit:]]+$') BETWEEN '57' AND '59'

【讨论】:

  • Regex 可能是您最好的选择。其他任何事情都需要多个步骤,并且可能会留下空白。
  • 您可能希望使用 TO_NUMBER 将数字的字符串表示形式转换为数字,然后再与您的测试用例进行比较。即在正则表达式之后但在测试之前。
  • 抱歉,您使用的是 regexp_like 而不是 regexp_replace。就我个人而言,我会使用 replace 只留下数字,然后是 TO_NUMBER 它们。不过,我关于比较数字字符串的观点仍然适用。
【解决方案2】:

知道了!我必须提到 @MrSlayer 指出 Oracle 支持正则表达式这一事实(不幸的是,REGEXP_LIKE() 返回一个 boolean 结果,这并不完全有帮助)。

可以这样做:

SELECT fileNumber
FROM File_Transfer
WHERE TO_NUMBER(REGEXP_SUBSTR(filenumber, '^(\d+)(\D*)$', 1, 1, 'x', 1)) >= 57
AND TO_NUMBER(REGEXP_SUBSTR(filenumber, '^(\d+)(\D*)$', 1, 1, 'x', 1)) < 60

(我还有一个可用的 SQL Fiddle example。)

这是假设您在 Oracle 11 下运行,尽管您可能能够将其调整为 10 中的等效项(10 缺少最终参数,即返回 数字部分)。这也假设您已经将文件编号作为数字开头,但如果需要,这不应该太难转换。当然,总是更喜欢“下限包含,上限不包含”形式的范围(并避免像瘟疫一样避免BETWEEN)。

【讨论】:

  • 谢谢。在@MrSlayer 的帮助下,我朝着这个方向前进。
猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 2015-05-11
  • 1970-01-01
  • 2013-10-11
  • 2017-05-17
  • 2015-11-28
  • 1970-01-01
  • 2021-04-30
相关资源
最近更新 更多