我在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。
答案 0 :(得分:3)
您可以使用正则表达式来获取数字,如下所示:
SELECT ....
WHERE REGEXP_LIKE(filenumber, '^[[:digit:]]+$') >= '57'
AND REGEXP_LIKE(filenumber, '^[[:digit:]]+$') <= '59'
但是,我之前从未使用过Oracle,所以这可能不起作用。
另一个简化的尝试:
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
)。