代码之家  ›  专栏  ›  技术社区  ›  Vijunav Vastivch

修剪mysql最后一个“和”值

  •  0
  • Vijunav Vastivch  · 技术社区  · 6 年前

    我有一个场景:

    这是我的剧本:

    set @p1 = '01';
    set @p2 = '02';
    set @p3 = '03';
    set @p4 = '04';
    set @p5 = '05';
    set @p6 = '';
    set @p7 = '07';
    set @p8 = '08';
    set @p9 = '09';
    set @p10 = '010';
    set @p11 = '11';
    
    SET @VAL =  concat_ws(' ',
    IF(@p1='','',concat_ws(' ','F1=', @p1,' AND')),
    IF(@p2='','',concat_ws(' ','F2=', @p2,' AND')),
    IF(@p3='','',concat_ws(' ','F3=', @p3,' AND')),
    IF(@p4='','',concat_ws(' ','F4=', @p4,' AND')),
    IF(@p5='','',concat_ws(' ','F5=', @p5,' AND')),
    IF(@p6='','',concat_ws(' ','F6=', @p6,' AND')),
    IF(@p7='','',concat_ws(' ','F7=',@p7,' AND')),
    IF(@p8='','',concat_ws(' ','F8=', @p8,' AND')),
    IF(@p9='','',concat_ws(' ','F9=', @p9,' AND')),
    IF(@p10='','',concat_ws(' ','F10=', @p10,' AND')),
    IF(@p11='','',concat_ws(' ','F11=', @p11))
    );
    
    SET @res = CONCAT_WS(' ','Select ','@VAL');
    
    PREPARE STMT FROM @res;
    EXECUTE  STMT;
    

    结果:

    F1= 01  AND F2= 02  AND F3= 03  AND F4= 04  AND F5= 05  AND  F7= 07  AND F8= 08  AND F9= 09  AND F10= 010  AND F11= 11
    

    此示例代码工作正常,但我的问题是以下示例:

    set @p1 = '01';
    set @p2 = '02';
    set @p3 = '03';
    set @p4 = '04';
    set @p5 = '05';
    set @p6 = '';
    set @p7 = '07';
    set @p8 = '08';
    set @p9 = '09';
    set @p10 = '010';
    set @p11 = '';
    
    SET @VAL =  concat_ws(' ',
    IF(@p1='','',concat_ws(' ','F1=', @p1,' AND')),
    IF(@p2='','',concat_ws(' ','F2=', @p2,' AND')),
    IF(@p3='','',concat_ws(' ','F3=', @p3,' AND')),
    IF(@p4='','',concat_ws(' ','F4=', @p4,' AND')),
    IF(@p5='','',concat_ws(' ','F5=', @p5,' AND')),
    IF(@p6='','',concat_ws(' ','F6=', @p6,' AND')),
    IF(@p7='','',concat_ws(' ','F7=',@p7,' AND')),
    IF(@p8='','',concat_ws(' ','F8=', @p8,' AND')),
    IF(@p9='','',concat_ws(' ','F9=', @p9,' AND')),
    IF(@p10='','',concat_ws(' ','F10=', @p10,' AND')),
    IF(@p11='','',concat_ws(' ','F11=', @p11))
    );
    
    SET @res = CONCAT_WS(' ','Select ','@VAL');
    
    PREPARE STMT FROM @res;
    EXECUTE  STMT;
    

    结果:

    F1= 01  AND F2= 02  AND F3= 03  AND F4= 04  AND F5= 05  AND  F7= 07  AND F8= 08  AND F9= 09  AND F10= 010  AND 
    

    如果最后一个字是 AND 从结果来看。

    如果有更好的主意,我们将不胜感激。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Nick SamSmith1986    6 年前

    一种方法是 AND 到外面去 CONCAT_WS 并得出 IF 声明 NULL 当变量为空时,因为 无效的 值将被忽略 串接 (见 manual )这样也可以简化内部 串接 CONCAT :

    set @p1 = '01';
    set @p2 = '02';
    set @p3 = '03';
    set @p4 = '04';
    set @p5 = '05';
    set @p6 = '';
    set @p7 = '07';
    set @p8 = '08';
    set @p9 = '09';
    set @p10 = '010';
    set @p11 = '';
    
    SET @VAL =  concat_ws(' AND ',
    IF(@p1='',NULL,concat('F1=', @p1)),
    IF(@p2='',NULL,concat('F2=', @p2)),
    IF(@p3='',NULL,concat('F3=', @p3)),
    IF(@p4='',NULL,concat('F4=', @p4)),
    IF(@p5='',NULL,concat('F5=', @p5)),
    IF(@p6='',NULL,concat('F6=', @p6)),
    IF(@p7='',NULL,concat('F7=',@p7)),
    IF(@p8='',NULL,concat('F8=', @p8)),
    IF(@p9='',NULL,concat('F9=', @p9)),
    IF(@p10='',NULL,concat('F10=', @p10)),
    IF(@p11='',NULL,concat('F11=', @p11))
    );
    
    SET @res = CONCAT_WS(' ','Select ','@VAL');
    
    PREPARE STMT FROM @res;
    EXECUTE  STMT;
    

    输出:

    F1=01 AND F2=02 AND F3=03 AND F4=04 AND F5=05 AND F7=07 AND F8=08 AND F9=09 AND F10=010
    

    Demo on dbfiddle

        2
  •  2
  •   Kebab Programmer virtual_programmer    6 年前

    你可以使用 TRIM() 函数首先删除尾随空格,然后删除尾随空格 AND

    SET @VAL = TRIM('AND' FROM TRIM(@VAL));
    
    SET @res = CONCAT_WS(' ','Select ','@VAL');
    

    演示: Fiddle Demo #1

    另一种方法是将数据存储到(临时)表中,并使用 GROUP_CONCAT() 聚合函数 ' AND ' 作为分隔符。将在where子句中筛选空值:

    set @p1 = '01';
    set @p2 = '02';
    set @p3 = '03';
    set @p4 = '04';
    set @p5 = '05';
    set @p6 = '';
    set @p7 = '07';
    set @p8 = '08';
    set @p9 = '09';
    set @p10 = '010';
    set @p11 = '';
    
    create temporary table k_v(
      k varchar(10),
      v varchar(10)
    );
    
    insert into k_v(k, v) values
      ('F1',   @p1),
      ('F2',   @p2),
      ('F3',   @p3),
      ('F4',   @p4),
      ('F5',   @p5),
      ('F6',   @p6),
      ('F7',   @p7),
      ('F8',   @p8),
      ('F9',   @p9),
      ('F10', @p10),
      ('F11', @p11);
    
    SET @VAL = (
      SELECT GROUP_CONCAT(k, '= ', v SEPARATOR ' AND ')
      FROM k_v
      WHERE v <> ''
    );
    
    SET @res = CONCAT_WS(' ','Select ','@VAL');
    
    PREPARE STMT FROM @res;
    EXECUTE  STMT;
    

    演示: Fiddle Demo #2

    取决于你的数据(@p1,…@pn)可能会有更优雅的解决方案。