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

FIND_IN_SET()とIN()

    SELECT  name
    FROM    orders,company
    WHERE   orderID = 1
            AND companyID IN (attachedCompanyIDs)
    

    attachedCompanyIDs INTにキャストされるスカラー値です (companyIDのタイプ 。

    キャストは、最初の数字以外(この場合はコンマ)までの数字のみを返します。

    したがって、

    companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)
    

    PostgreSQLで 、文字列を配列にキャストする(または最初に配列として格納する)ことができます:

    SELECT  name
    FROM    orders
    JOIN    company
    ON      companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])
    WHERE   orderID = 1
    

    これは、companyIDのインデックスも使用します 。

    残念ながら、これはMySQLでは機能しません 後者はアレイをサポートしていないためです。

    この記事はおもしろいと思うかもしれません(#2を参照) ):

    更新:

    カンマ区切りのリストの値の数にある程度の制限がある場合(たとえば、5以下) )、このクエリを使用してみることができます:

    SELECT  name
    FROM    orders
    CROSS JOIN
            (
            SELECT  1 AS pos
            UNION ALL
            SELECT  2 AS pos
            UNION ALL
            SELECT  3 AS pos
            UNION ALL
            SELECT  4 AS pos
            UNION ALL
            SELECT  5 AS pos
            ) q
    JOIN    company
    ON      companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED)
    


    1. 完全なmysqlmysqldumpファイルから単一のテーブルを復元できますか?

    2. WindowsでMySQLのルートパスワードをリセットする

    3. select内で変数を定義し、同じselect内で使用します

    4. タイムスタンプが今日の日付と一致する場合、SQLiteは行を選択します