当前位置: 首页 > 面试题库 >

FIND_IN_SET()与IN()

孙修德
2023-03-14
问题内容

我的数据库中有2个表。一种是用于订单,一种是用于公司。

订单具有以下结构:

OrderID     |     attachedCompanyIDs
------------------------------------
   1                     1,2,3
   2                     2,4

公司具有以下结构:

CompanyID      |        name
--------------------------------------
    1                 Company 1
    2                 Another Company
    3                 StackOverflow
    4                 Nothing

要获取订单的公司名称,我可以这样查询:

SELECT name FROM orders,company
WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)

该查询工作正常,但以下查询却无法正常工作。

SELECT name FROM orders,company
WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)

为什么第一个查询有效但第二个查询无效?

第一个查询返回:

name
---------------
Company 1
Another Company
StackOverflow

第二个查询仅返回:

name
---------------
Company 1

为什么会这样,为什么第一个查询返回所有公司,而第二个查询仅返回第一个公司?


问题答案:
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):

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

更新:

如果以逗号分隔的列表中的值数量有一定的合理限制(例如,不超过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)


 类似资料:
  • 问题内容: 我该怎么做: 问题答案: 如果找到匹配项,则返回匹配的索引;如果找不到,则返回0。由于0为FALSE,因此您可以使用

  • 问题内容: 我发现 find_in_set 仅按单个字符串搜索: 在上面的示例中,“ a”是唯一用于搜索的字符串。 有什么方法可以使用find_in_set类型的功能并通过多个字符串进行搜索,例如: 在上面的示例中,我想通过三个字符串’a,b,c’进行搜索。 我看到的一种方法是使用 OR 除此之外,还有其他方法吗? 问题答案: 没有本机函数可以执行此操作,但是您可以使用以下技巧来实现目标

  • 本文向大家介绍mysql中find_in_set函数的基本使用方法,包括了mysql中find_in_set函数的基本使用方法的使用技巧和注意事项,需要的朋友参考一下 前言 这是我最近新接触到的一个函数, 我在项目中的使用场景是这样的: 有一个应用类型表,表中有parentId字段和parentIds字段,前者为父级id,后者为多级父级id,在库中都是varchar类型,parentIds由多个父

  • 问题内容: 谁能解释一下java 和类之间是否有区别,如果有区别,请解释一下。我用谷歌搜索了它,但是找不到任何解释。 问题答案: InetAddress InetAddress的实例由IP地址以及可能与其对应的主机名组成 InetSocketAddress 此类实现IP套接字地址(IP地址+端口号),也可以是一对(主机名+端口号),在这种情况下,将尝试解析主机名

  • 问题内容: 我正在尝试遵循本教程: http://www.vogella.com/articles/AndroidCalendar/article.html 我了解putExtra的作用 但是我不明白setData()是什么意思? Android文档并没有太大帮助: 这对常数意味着什么 ? 当我注释掉此行时,似乎没有任何影响。 问题答案: 用于指向 位置 的数据对象(例如像文件),而增加了 简单的

  • 问题内容: 我似乎无法确定任何区别和另外两个被初始化的方式。使用一个或另一个有什么好处吗?其他大多数文章都介绍了vs ,但与此相反。在我看来,它们都有相同的目的。 问题答案: 首先,可以处理所有输入流,而不仅仅是文件。其他示例是网络连接,类路径资源和ZIP文件。 其次,直到Java 11不允许您指定编码,而只使用平台默认编码,这使它几乎无用,因为当代码在具有不同平台默认编码的系统上运行时,使用它会