SELECT name
FROM orders,company
WHERE orderID = 1
AND companyID IN (attachedCompanyIDs)
attachedCompanyIDs adalah nilai skalar yang dimasukkan ke dalam INT (jenis companyID ).
Pemeran hanya mengembalikan angka hingga non-digit pertama (dalam kasus Anda koma).
Jadi,
companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)
Di PostgreSQL , Anda bisa memasukkan string ke dalam array (atau menyimpannya sebagai array di tempat pertama):
SELECT name
FROM orders
JOIN company
ON companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])
WHERE orderID = 1
dan ini bahkan akan menggunakan indeks pada companyID .
Sayangnya, ini tidak berfungsi di MySQL karena yang terakhir tidak mendukung array.
Anda mungkin menganggap artikel ini menarik (lihat #2 ):
Pembaruan:
Jika ada batasan yang wajar pada jumlah nilai dalam daftar yang dipisahkan koma (misalnya, tidak lebih dari 5 ), sehingga Anda dapat mencoba menggunakan kueri ini:
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)