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

OracleのmysqlのFind_in_setの代替は何ですか

    MySQLの<の正確な代替ではありません。 code> FIND_IN_SET 、ただし、例の場合(値がコンマ区切りのセットに含まれているかどうかのみを知る必要がある場合)、Oracleの REGEX_COUNT 正規表現'^([^、] +、)* your_value(、[^、] +)*$'を使用 収まります。

    次のSQLクエリを調べます(Oracleの場合)...

    数字の例

    番号1を検索します セット内: [1,2,3,4,5,6,11,12,13]

    SELECT
        CASE WHEN REGEXP_COUNT('1,2,3,4,5,6,11,12,13', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
            THEN 1 ELSE 0
        END AS cnt
    FROM DUAL;
    

    1を返します 正しく

    番号1を検索します セット内:[111,222,333]。この場合、INSTRはネガティブを報告できません。

    SELECT
        CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
            THEN 1 ELSE 0
        END AS cnt
    FROM DUAL;
    

    0を返します 正しく

    文字列の例

    'John'を検索します 名前のセット:

    SELECT
        CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*John(,[^,]+)*$', 1, 'i') > 0
            THEN 1 ELSE 0
        END as cnt
    FROM DUAL;
    

    1を返します 正しく

    ただし、文字'a'を検索すると 、正しくゼロを返します(INSTRは再び失敗します)。

    SELECT
        CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*a(,[^,]+)*$', 1, 'i') > 0
            THEN 1 ELSE 0
        END as cnt
    FROM DUAL;
    

    0を返します 正しく

    私はこの質問がずっと前に答え​​られたことを知っています、しかしそれは検索結果でよくランク付けされて、そしておそらくオラクルの INSTRより明白であるがより正しい解決策を探す他の人を助けるかもしれません 機能。

    ブール式

    ORなどのブール式を使用することもできます。 またはAND

    ORを使用した例 は次のとおりです:

    SELECT
        CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*(helen|peter)(,[^,]+)*$', 1, 'i') > 0
            THEN 1 ELSE 0
        END as cnt
    FROM DUAL;
    

    1を返します 正しく、「peter」が見つかったので(「helen」のいずれかを検索します または"peter"

    ANDの場合 アプローチは少し異なります(CASE式を修正します) 正規表現の代わりに ):

    SELECT
        CASE WHEN
                REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*john(,[^,]+)*$', 1, 'i') > 0 AND
                REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*peter(,[^,]+)*$', 1, 'i') > 0
            THEN 1 ELSE 0
        END as cnt
    FROM DUAL;
    

    上記のクエリは、両方の "john"を検索します。 そして 「ピーター」 AND REGEXP_COUNT を複製することで、操作を簡単に実装できます。 CASEの式 ただし、構文はわずかなパフォーマンスの低下を伴います。



    1. すべての列の最も一般的な値を取得します

    2. MySQLシャーディングアプローチ?

    3. フィルタされたインデックスを追加することの予期しない副作用

    4. MySql Connector.NetがWindowsボックスで機能するのに、Monoでは機能しないのはなぜですか?