我有这样的代码。

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个卡通尼。
但当我使用下面的代码时,我得到了正确的结果。
  SELECT GROUP_CONCAT(a_cartonid) FROM t_carton WHERE FIND_IN_SET( a_shipmentid, shipmentnumbers ) INTO cartonid;

我想知道in和find_in_set和hwo di到底有什么区别,我决定使用什么。

最佳答案

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。

10-07 19:38
查看更多