FIND_IN_SET() vs IN(), StackOverFlow上的一个问题

经过一个实例简述数据库查询里FIND_IN_SET() 和IN()区别html


问题: mysql

数据库中有两个表: Orders 和 Companiessql

Orders的表结构: 数据库

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

Campany表结构:数组

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

想要查询的数据为: ID为1的order对应的所有Company的名字.

楼主给出两种查询方式:spa

第一种:code

SELECT name FROM orders,company
WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)
工做正常. 查询结果以下:

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

第二种:htm

SELECT name FROM orders,company
WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
出现问题, 查询结果以下:

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

做何解释?字符串


答案:get

使用关键字IN时, 会自动对值的类型进行转换, 而后在进行操做. 在上面的状况中

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

attachedCompanyIDs 的值将被转化成INT (也就是CompanyID的类型), 因此这里字符串"1,2,3"在转换过程当中会变成1(到第一个非数字位中止转换). 所以,

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
可是MySQL暂不支持. 你能够在这个连接里面找到一些有趣的文章:


原文地址: http://stackoverflow.com/questions/4155873/find-in-set-vs-in

相关文章
相关标签/搜索