2013-03-27 2 views
3

У меня есть код вроде этого.Почему find_in_set работает, но IN-код

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 и HWO ди я решить, что использовать.

ответ

2

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' поэтому запрос выше возвращает ложь.

+0

как об этом 'SELECT FIND_IN_SET (" abc ", 'abc', 'abd', 'asr', 'asd')'? Это будет работать правильно? – Unbreakable

1

FIND_IN_SET ищет строку внутри набора строк, разделенных запятой.

Но вам не нужно использовать GROUP_CONCAT для конкатенации строк, которые будут использоваться в предложении IN, попробуйте это,

SELECT GROUP_CONCAT(a_cartonid) 
FROM t_carton 
WHERE a_shipmentid IN 
     (
      SELECT a_shipmentid 
      FROM t_shipment 
      WHERE a_orderid = orderid 
     ) 

или использовать JOIN

SELECT GROUP_CONCAT(DISTINCT a.a_cartonid) 
FROM t_carton a 
     INNER JOIN 
     (
      SELECT a_shipmentid 
      FROM t_shipment 
      WHERE a_orderid = orderid 
     ) b ON a.a_shipmentid = b.a_shipmentid 
Смежные вопросы