SELECT不能仅在@sql语句中使用

时间:2015-07-23 11:29:19

标签: mysql

我有一个在桌子上完美运行的查询,但在另一个表上不起作用: 这是代码(请注意,这是另一个查询的一部分):

SET @sql = Null;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT('SUM(CASE WHEN columnA = "'  ,columnA, ' "THEN 1 ELSE 0 end) AS "'  ,columnA, ' "'))
into @sql
from table;

我不知道为什么它适用于某个表,但是当我打开另一个表时它会给我这个错误

1 row(s) affected, 1 warning(s): 1260 Row 12 was cut by GROUP_CONCAT()

如果我删除@sql的东西,我做了选择它给我的数据没有错误...但它在某些时候截断字符串...我不知道为什么

2 个答案:

答案 0 :(得分:0)

因为您正在尝试构建一个动态查询(预处理语句),它应该类似于下面的内容。您CASE条件CASE WHEN columnA = columnA THEN 1 ELSE 0 end似乎无效,因为columnA = columnA始终为真。

declare @sql varchar(200);
set @sql = 'SELECT
GROUP_CONCAT(DISTINCT
CONCAT(SUM(CASE WHEN columnA = columnA THEN 1 ELSE 0 end) AS columnA))
into (another sql query part)
from table';

答案 1 :(得分:0)

group_concat()有一个最大长度,你似乎超过了这个。记录在案here

您可以重置最大长度。

但是,您也可以简化逻辑:

SET @sql = Null;
SELECT GROUP_CONCAT(DISTINCT REPLACE('SUM(ColumnA = ''@val'') as `@val`',
                                     '@val', columnA))
into @sql
from table;

如果没有case表达式,也许您的字符串将符合默认长度。

我发现使用replace()构建字符串而不是concat()要容易得多。您可以看到正在使用的模板。