SELECT name
FROM orders,company
WHERE orderID = 1
AND companyID IN (attachedCompanyIDs)
attachedCompanyIDs
er en skalær værdi, som er castet ind i INT
(type companyID
).
Castet returnerer kun tal op til det første ikke-ciffer (et komma i dit tilfælde).
Således,
companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)
I PostgreSQL
, kan du støbe strengen ind i et array (eller gemme det som et array i første omgang):
SELECT name
FROM orders
JOIN company
ON companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])
WHERE orderID = 1
og dette ville endda bruge et indeks på companyID
.
Desværre virker dette ikke i MySQL
da sidstnævnte ikke understøtter arrays.
Du finder muligvis denne artikel interessant (se #2
):
Opdatering:
Hvis der er en rimelig grænse for antallet af værdier i de kommaseparerede lister (f.eks. ikke mere end 5
), så du kan prøve at bruge denne forespørgsel:
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)