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

次のように、正規表現を使用して数字のみを取得できる場合があります。

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

ただし、これまでOracleを使用したことがないため、これが機能しない可能性があります。

このSOの答えに基づいています。

別の単純化された試み:

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

とった!OracleがRegexをサポートしているという事実を指摘してくれた@MrSlayerに言及する必要があります(残念ながら、ブール値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 に答える