通过一个实例简述数据库查询里FIND_IN_SET() 和IN()区别
问题:
数据库中有两个表: Orders 和 Companies
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的名字.
楼主给出两种查询方式:
第一种:
SELECT name FROM orders,company
WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)
工作正常. 查询结果如下:
name
---------------
Company 1
Another Company
StackOverflow
第二种:
SELECT name FROM orders,company
WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
出现问题, 查询结果如下:
name
---------------
Company 1
Another Company
StackOverflow
作何解释?
答案:
使用关键字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)
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