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)