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
。
您可能会发现这篇文章很有趣(请参阅参考资料#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)