您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

FIND_IN_SET()与IN()

FIND_IN_SET()与IN()

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)
其他 2022/1/1 18:21:40 有401人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶