我有一个执行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())
,但我不知道如何得到我需要的东西。
这看起来很简单!告诉我你的知识人! 提前谢谢!
答案 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('''', ...'