mysql - 修剪Mysql最后一个“AND”值
问题描述
我有一个场景:
这是我的脚本:
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
如果最后一个词来自结果,我需要删除。
非常感谢任何更好的想法。
解决方案
您可以使用TRIM()函数首先删除尾随空格,然后删除尾随AND
SET @VAL = TRIM('AND' FROM TRIM(@VAL));
SET @res = CONCAT_WS(' ','Select ','@VAL');
演示:小提琴演示#1
另一种方法是将数据存储到(临时)表中,并将GROUP_CONCAT()
聚合函数与' AND '
as SEPARATOR 一起使用。空值将在 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;
演示:小提琴演示#2
根据您的数据(@p1、..@pN)的来源,可能会有更优雅的解决方案。
推荐阅读
- python - 序列化程序调用显示 TypeError:“ListSerializer”类型的对象不是 JSON 可序列化的?
- vuejs2 - 实现:无法在 Dropdown._makeDropdownFocusable 处设置属性“tabIndex”为空
- swift - 如何获取 MacOS Xcode 项目中使用的 sparkle 框架的当前版本
- android - Android 7.0:自定义通知声音不再起作用
- npm - Gitlab CI:在存储库中创建 dist 文件夹?
- ios - 如何在 Swift 中为按钮的属性不重复代码?
- .net - “Stripe.Infrastructure.StripeTypeRegistry”的类型初始化器抛出异常?
- arrays - Angular 仅显示符合 *ngIf 特定条件的数组元素?
- swift - UITest MacOS Click to MenuBar 应用程序不起作用
- html - 电子邮件中的响应式 HTML 表格