0

アルファベットで始まる値を見つける方法。

例えば

私はデータを持っています

prodCode

12FDBC
34IO
ZklM
hOP
12-b.9     

ZklM以上のことから、hOP返品したいと思います。これどうやってするの?

4

2 に答える 2

2

明白な答えは、可能であればアップグレードです。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()しても大きな違いはありません。

于 2015-03-25T08:39:17.503 に答える
0

私はオラクルに精通していませんが、次のようなものです: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 + '%'
    )
于 2015-03-25T08:24:28.670 に答える