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)