Oracleには、次のような文字列を持つことができる列(X)を持つテーブルがあります。
97M
481
101X8821E
など
_
_
x> 90の整数値を持つ行だけを選択したいと思います。この例では、値97M、101X、および481を含む行を取得することを期待しています。これを行うにはどうすればよいですか。
使用する前にREGEXP_REPLACEを使用して英字を削除し、TO_NUMBER
必要に応じて結果をフィルタリングできるようにしました。
WITH t
AS (SELECT '97F' AS x FROM DUAL
UNION
SELECT '481' FROM dual
UNION
SELECT '101A' FROM dual
UNION
SELECT '101A' FROM dual
UNION
SELECT '88' FROM dual
UNION
SELECT '21E' FROM dual)
SELECT x
FROM t
WHERE TO_NUMBER(regexp_replace(x, '[[:alpha:]]', '')) > 90;
X
101A
481
97F
それが役に立てば幸い...
常にtranslateを使用して英字を削除できます。
TO_NUMBER(translate('90F', '1ABCDEFGHIJKLMNOPQRSTUFWXYZ', '1')) -- = 90
Translateは、2番目の引数の文字を3番目の引数の文字に1対1で変換します。
これは別の例です。
translate('ABCDEFG', 'ABC', 'XYZ') = 'XYZDEFG'
A -> X
B -> Y
C -> Z
さて、私の例を見ると
translate('90F', '1ABCDEFGHIJKLMNOPQRSTUFWXYZ', '1')
1 -> 1 (this is here because if that last argument is null, you'll get an empty string)
A -> ? there's nothing here, so oracle will translate it to nothing
B -> same as above
次のことを試してみてください。
WHERE (substr(x, 1, 1) = '9' and substr(x, 2, 1) between '1' and '9'
) or
(substr(x, 1, 1) between '1' and '9' and
substr(x, 2, 1) between '0' and '9' and
substr(x, 3, 1) between '0' and '9'
)
これは少しブルートフォースです。文字列が91〜99で始まるかどうか、または最初の3桁が文字列であるかどうかを確認します。