mysql - 为什么 find_in_set 有效但 IN 子句

标签 mysql sql select

我有这样的代码。

DELIMITER $$
    CREATE PROCEDURE `sp_deleteOrderData`(orderid BIGINT(11))
    BEGIN
        DECLARE shipmentnumbers VARCHAR(1000);
        DECLARE cartonid VARCHAR(1000);

        SELECT GROUP_CONCAT(a_shipmentid) FROM t_shipment WHERE a_orderid = orderid INTO shipmentnumbers;

        SELECT GROUP_CONCAT(a_cartonid) FROM t_carton WHERE a_shipmentid IN (shipmentnumbers) INTO cartonid;

    SELECT shipmentnumbers;
    /*SELECT  cartonid;  */
    END$$

    DELIMITER ;

此处 shipmentnumbers 返回 100020,100021,100022 理想情况下,cartonid 应返回为 11,12,13

但我只得到 11 个 cartonid。

但是当我使用下面的代码时,我得到了正确的结果。

  SELECT GROUP_CONCAT(a_cartonid) FROM t_carton WHERE FIND_IN_SET( a_shipmentid, shipmentnumbers ) INTO cartonid;

我想知道 IN 和 FIND_IN_SET 之间到底有什么区别,以及我如何决定使用什么。

最佳答案

IN 接受要搜索的列表或参数,FIND_IN_SET 接受包含逗号分隔列表的字符串参数:

SELECT  1 IN (1, 2, 3, 4)

SELECT  FIND_IN_SET(1, '1,2,3,4')

如果您尝试将 IN 应用于逗号分隔的字符串,它会将其视为单个参数并将其作为一个整体进行匹配:

SELECT  1 IN ('1,2,3,4')

当然,字符串 '1' 不等于字符串 '1,2,3,4' 所以上面的查询返回 false。

关于mysql - 为什么 find_in_set 有效但 IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15656740/

相关文章:

SQL 获取字符串最常见部分的计数

select - SQL 通过将值与聚合函数结果进行比较来选择行

mysql - 从一个表中选择列值存在于另一个表中的记录

php - 启用 GAE PHP 运行时以允许本地文件批量插入到 Cloud SQL

mysql - MySQL 数据库 : MySQL Incorrect datetime value 的 ISO 8601 时间戳

sql - 在数据库中存储非常大的文件

sql - 合并两个表,旧列的新列之和

mysql - 从两个表中选择一行的最大值

mysqli_stmt_bind_param 正在我的中插入零

sql - 此 Sql Server 查询中的 CTE 语法有什么问题?