使用CONCAT生成的字符串在存储过程中使用CONCAT_WS()将两列合并为一列

时间:2017-04-26 19:25:05

标签: mysql stored-procedures concatenation

我有一个执行select的存储过程。真实情况要复杂得多,但是假设我设法使用CONCAT创建一个动态查询,所以我最终得到了一个有效的查询字符串,可以准备执行。这个例子说明了它:

DELIMITER ;;
DROP PROCEDURE IF EXISTS tmp;;
CREATE PROCEDURE tmp()
BEGIN

SET @sql = '';
SET @sql = CONCAT('SELECT
                        ib.visit_id,
                        ib.visit_child
                   FROM
                        infoBase ib
                   GROUP BY
                        visit_id, visit_child');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END;;
DELIMITER ;

我得到了预期的结果没有问题:

╔══════════╦═════════════╗
║ visit_id ║ visit_child ║
╠══════════╬═════════════╣
║   121340 ║      104280 ║
║   121341 ║      114447 ║
║   121485 ║      114190 ║
╚══════════╩═════════════╝

现在我想要第三列包含其他两个的连接值,如下所示:

╔══════════╦═════════════╦══════════════╗
║ visit_id ║ visit_child ║   combined   ║
╠══════════╬═════════════╬══════════════╣
║   121340 ║      104280 ║ 121340104280 ║
║   121341 ║      114447 ║ 121341114447 ║
║   121485 ║      114190 ║ 121485114190 ║
╚══════════╩═════════════╩══════════════╝

我添加CONCAT_WS来完成此任务:

DELIMITER ;;
DROP PROCEDURE IF EXISTS tmp;;
CREATE PROCEDURE tmp()
BEGIN

SET @sql = '';
SET @sql = CONCAT('SELECT
                        ib.visit_id,
                        ib.visit_child,
                        CONCAT_WS('', ib.visit_id, ib.visit_child) AS combined
                   FROM
                        infoBase ib
                   GROUP BY
                        visit_id, visit_child');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END;;
DELIMITER ;

但如果我在Error Code: 1064时尝试这样做,我会得到call myDB.tmp(); 如果我在没有存储过程的情况下运行上面显示的SELECT语句,它就完全符合我的需要,所以我很确定问题依赖于嵌套的CONCAT(CONCAT_WS()),但我不知道如何得到我需要的东西。

这看起来很简单!告诉我你的知识人! 提前谢谢!

1 个答案:

答案 0 :(得分:1)

问题是单引号:

该行:

'... CONCAT_WS('', ib.visit_id, ib.visit_child) ...'

将翻译为:

'... CONCAT_WS(', ib.visit_id, ib.visit_child) ...'

你必须逃避单引号:

SET @sql = CONCAT('SELECT
                        ib.visit_id,
                        ib.visit_child,
                        CONCAT_WS(\'\', ib.visit_id, ib.visit_child) AS combined
                   FROM
                        infoBase ib
                   GROUP BY
                        visit_id, visit_child');

您也可以使用:

'... CONCAT_WS('''', ...'