大多数数字范围

时间:2012-08-17 20:02:04

标签: sql oracle coldfusion

我在Oracle数据库中有一个列,我使用ColdFusion访问该列,并希望选择一系列项目。

该列主要是数字,但在数字末尾包含一些字母。 样本数据: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。

2 个答案:

答案 0 :(得分:3)

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

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'

答案 1 :(得分:2)

知道了!我不得不提到@MrSlayer指出Oracle支持Regex的事实(不幸的是,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小提琴example。)

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