Py学习  »  DATABASE

修剪mysql最后一个“和”值

Vijunav Vastivch • 4 年前 • 567 次点击  

我有一个场景:

这是我的剧本:

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 从结果来看。

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43453
 
567 次点击  
文章 [ 2 ]  |  最新文章 4 年前
Kebab Programmer
Reply   •   1 楼
Kebab Programmer    5 年前

你可以使用 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)可能会有更优雅的解决方案。

Nick Harbdollar
Reply   •   2 楼
Nick Harbdollar    5 年前

一种方法是 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