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

MysqlのLIKE句の代替

    prod_catg LIKE '1,%' --matches when 1 is the first category
    OR prod_catg LIKE '%,1,%' --matches when 1 is somewhere in the middle
    OR prod_catg LIKE '%,1' --matches 1 when is the last category
    

    とにかく、製品(メイン)テーブルにカテゴリテーブルとその参照を追加して、スキーマをリファクタリングすることをお勧めします

    編集

    この問題に対処する別の方法は、REGEXP を使用することです。 これにより、WHEREが短くなります 条項(これが私がテストに使用したものです):

    DECLARE @regexp VARCHAR(100);
    SET @regexp = '^1,.*|.*,1$|.*,1,.*';
    
    SELECT
        '1,11,15,51,22,31' REGEXP @regexp AS test1,
        '51,11,15,1,22,31' REGEXP @regexp AS test2,
        '11,15,51,22,31,1' REGEXP @regexp AS test3,
        '7,11,15,51,22,31' REGEXP @regexp AS test4,
        '51,11,15,7,22,31' REGEXP @regexp AS test5,
        '11,15,51,22,31,7' REGEXP @regexp AS test6;
    

    これはprod_catgと一致します 正規表現に対して'^1,.*|.*,1$|.*,1,.*' returnig 1 (TRUE) 一致する場合、0 (FALSE) それ以外の場合。

    その場合、WHERE句は次のようになります。

    WHERE prod_catg REGEXP '^1,.*|.*,1$|.*,1,.*'
    

    正規表現の説明:

    ^1,.* --matches 1 at the beginning of a string followed by a `,` and any other char
    .*,1$ --matches 1 at the end of a string preceded by a `,` and any other char
    .*,1,.* --matches 1 between two `,` which are sourrounded by any other chars
    | --is the OR operator
    

    この正規表現はもっとコンパクトになると思いますが、正規表現はあまり得意ではありません

    明らかに、正規表現で探しているカテゴリを変更できます(1を置き換えてみてください 7を使用 上記の例で)



    1. サブクエリにないSQLselectは結果を返しません

    2. MySQLでデータベースのすべての権限を付与する方法

    3. カンマ区切りのリストを値と照合するにはどうすればよいですか?

    4. MySQLホスティングを使用してZEITにWordPress5をインストールする