アルファベットで始まる値を見つける方法。
例えば
私はデータを持っています
prodCode
12FDBC
34IO
ZklM
hOP
12-b.9
ZklM
以上のことから、hOP
返品したいと思います。これどうやってするの?
明白な答えは、可能であればアップグレードです。8i の延長サポートが終了した日付すらわかりません。9i の場合は 2007 年 7 月 31 日で、ほぼ 8 年前です。
それができない場合は、受け入れたいすべての文字を列挙する必要があります。過度に長い次のようなもの:
select *
from ...
where lower(substr(prod_code, 1, 1)) in ('a', 'b', ..., 'z')
または、これはあまり明白ではありませんが、小さいです。
select *
from ...
where trim(translate(lower(substr(prod_code, 1, 1))
, 'abcdefghijklmnopqrstuvwxyz', ' ')) is null
または、受け入れて結合したい文字を含むテーブルを作成することもできます。
select *
from ... a
, alphabet b
where substr(a.prod_code, 1, 1) = b.character
最後に、関数を使用できますASCII()
。これは、8i に存在していたと確信しています。
select *
from ...
where ascii(lower(substr(a.prod_code, 1, 1))) between 97 and 122
生活を楽にするために、これらの状況のほとんどで明示的に大文字を小文字にします。これにインデックスを付けたい場合は、とにかく関数インデックスを作成することになり、追加LOWER()
しても大きな違いはありません。
私はオラクルに精通していませんが、次のようなものです:WHERE REGEXP_LIKE(prodCode, '[aZ].*')
更新: 見苦しいです。MS SQL Server 用ですが、役立つかもしれません (Oracle の構文はわかりません。ダミー テーブルから選択するときに FROM デュアルを追加する必要があることがわかっている唯一のことです):
SELECT
*
FROM
#test t
WHERE substr(a, 1, 1) BETWEEN 'a' AND 'Z'
また
CREATE TABLE #test
(
a VARCHAR(100)
);
INSERT INTO #test VALUES ('12FDBC');
INSERT INTO #test VALUES ('34IO');
INSERT INTO #test VALUES ('ZklM');
INSERT INTO #test VALUES ('hOP');
INSERT INTO #test VALUES ('12-b.9');
SELECT * FROM #test t
WHERE NOT EXISTS (
SELECT * FROM (
SELECT '1' a
UNION ALL SELECT '2'
UNION ALL SELECT '3'
UNION ALL SELECT '4'
UNION ALL SELECT '5'
UNION ALL SELECT '6'
UNION ALL SELECT '7'
UNION ALL SELECT '8'
UNION ALL SELECT '9'
UNION ALL SELECT '0' ) a
WHERE t.a LIKE a.a + '%'
)