0

我正在使用 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。

4

2 回答 2

3

You might be able to use a regular expression to get the digits only, like so:

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

However, I have never used Oracle before, so this might not work.

Based on this SO answer.

Another, simplified attempt:

SELECT ....
WHERE REGEXP_LIKE(filenumber, '^[[:digit:]]+$') BETWEEN '57' AND '59'
于 2012-08-17T20:07:06.180 回答
2

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

这可以这样做:

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示例。)

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

于 2012-08-17T22:15:30.460 回答