FIND_IN_SET()与IN()

FIND_IN_SET()与IN(),第1张

FIND_IN_SET()与IN()
SELECt  nameFROM    orders,companyWHERe   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  nameFROM    ordersJOIN    companyON      companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[])WHERe   orderID = 1

甚至会在上使用索引

companyID

不幸的是,这不起作用,

MySQL
因为后者不支持数组。

您可能会发现这篇文章很有趣(请参阅参考资料

#2
):

  • MySQL中的10件事(无法按预期工作)

更新:

如果以逗号分隔的列表中的值数量有一定的合理限制(例如,不超过

5
),那么您可以尝试使用此查询:

SELECt  nameFROM    ordersCROSS 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        ) qJOIN    companyON      companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4909748.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存