sql >> データベース >  >> RDS >> Oracle

Oracleで英数字のみを含む行を返す2つの方法

    以下は、OracleDatabaseで英数字のみを含む行を返すための2つのメソッドです。

    英数字は、英字と英数字です。

    サンプルデータ

    例では、次のデータを使用します。

    CREATE TABLE t1 (
        c1 varchar(255) NULL
        );
    
    INSERT INTO t1 (c1) 
        WITH c AS (
            SELECT 'Music' FROM DUAL UNION ALL
            SELECT 'Live Music' FROM DUAL UNION ALL
            SELECT 'Café' FROM DUAL UNION ALL
            SELECT 'Café Del Mar' FROM DUAL UNION ALL
            SELECT '100 Cafés' FROM DUAL UNION ALL
            SELECT '[email protected]' FROM DUAL UNION ALL
            SELECT '1 + 1' FROM DUAL UNION ALL
            SELECT '()' FROM DUAL UNION ALL
            SELECT '[email protected]#&()–[{}]:;'',?/*' FROM DUAL UNION ALL
            SELECT '`~$^+=<>“' FROM DUAL UNION ALL
            SELECT '$1.50' FROM DUAL UNION ALL
            SELECT 'Player 456' FROM DUAL UNION ALL
            SELECT '007' FROM DUAL UNION ALL
            SELECT 'é' FROM DUAL UNION ALL
            SELECT 'É' FROM DUAL UNION ALL
            SELECT 'é 123' FROM DUAL UNION ALL
            SELECT 'ø' FROM DUAL UNION ALL
            SELECT 'ø 123' FROM DUAL)
    SELECT * FROM c;
    
    SELECT c1 FROM t1;

    結果:

    Music
    Live Music
    Café
    Café Del Mar
    100 Cafés
    [email protected]
    1 + 1
    ()
    [email protected]#&()–[{}]:;',?/*
    `~$^+=<>“
    $1.50
    Player 456
    007
    é
    É
    é 123
    ø
    ø 123

    オプション1:[:alnum:]と比較

    OracleのREGEXP_LIKE()を使用できます 値を正規表現と比較する関数。

    Oracleの正規表現機能には、POSIX文字クラスのサポートが含まれています。したがって、[:alnum:]を使用できます 英数字を含む行を検索するための正規表現のPOSIX文字クラス。

    SELECT c1 FROM t1 
    WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');

    結果:

    Music
    Café
    007
    é
    É
    ø

    これにより、英数字のみを含む行のみが返されました。行に英数字と英数字以外の文字の両方が含まれている場合、その行は返されません。

    スペース文字は英数字ではないと見なされるため、スペースを含める場合は、次のようにすることができます。

    SELECT c1 FROM t1 
    WHERE REGEXP_LIKE(c1, '^[[:alnum:] ]+$');

    結果:

    Music
    Live Music
    Café
    Café Del Mar
    100 Cafés
    Player 456
    007
    é
    É
    é 123
    ø
    ø 123

    含むすべての行を返す 英数字(行に英数字以外の文字も含まれている場合でも)、これを行うことができます:

    SELECT c1 FROM t1 
    WHERE REGEXP_LIKE(c1, '[[:alnum:]]');

    結果:

    Music
    Live Music
    Café
    Café Del Mar
    100 Cafés
    [email protected]
    1 + 1
    $1.50
    Player 456
    007
    é
    É
    é 123
    ø
    ø 123

    オプション2:文字の範囲を指定する

    これを行う別の方法は、正規表現内で文字の範囲を指定することです。

    例:

    SELECT c1 FROM t1 
    WHERE REGEXP_LIKE(c1, '^[A-Za-z0-9]+$');

    結果:

    Music
    007

    これにより、最初の例よりも返される行が少なくなります。これは、éを含めなかったためです。 、É 、またはø 私の範囲内の文字であるため、それらの文字を含む行はすべて出力から除外されます。

    したがって、この方法を使用するときは、含める必要のある文字を誤って除外した場合に備えて注意する必要があります。

    ここでも、これらの文字を含む範囲があります:

    SELECT c1 FROM t1 
    WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9]+$');

    結果:

    Music
    Café
    007
    é
    É
    ø

    次のようなスペースを含めることができます:

    SELECT c1 FROM t1 
    WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9 ]+$');

    結果:

    Music
    Live Music
    Café
    Café Del Mar
    100 Cafés
    Player 456
    007
    é
    É
    é 123
    ø
    ø 123

    また、以下を使用して、含むすべての行を含めることができます。 私たちの範囲の文字(この範囲外の文字も含まれている場合でも):

    SELECT c1 FROM t1 
    WHERE REGEXP_LIKE(c1, '[A-Za-zÀ-Þß-ÿ0-9]');

    結果:

    Music
    Live Music
    Café
    Café Del Mar
    100 Cafés
    [email protected]
    1 + 1
    $1.50
    Player 456
    007
    é
    É
    é 123
    ø
    ø 123

    または、これらのUnicode文字を含めたくない場合は、次のように簡略化できます:

    SELECT c1 FROM t1 
    WHERE REGEXP_LIKE(c1, '[A-Za-z0-9]');

    結果:

    Music
    Live Music
    Café
    Café Del Mar
    100 Cafés
    [email protected]
    1 + 1
    $1.50
    Player 456
    007
    é 123
    ø 123

    これらのUnicode文字が英数字と行を共有している場合、これは出力から除外されません。


    1. SQL Server(T-SQL)で現在のログイン名を返す

    2. IDENT_CURRENT()を使用して、SQLServerのID列の現在のID値を返します

    3. JSON列の配列の要素をクエリします

    4. MariaDBでのDATE_ADD()のしくみ