我有一个在桌子上完美运行的查询,但在另一个表上不起作用: 这是代码(请注意,这是另一个查询的一部分):
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的东西,我做了选择它给我的数据没有错误...但它在某些时候截断字符串...我不知道为什么
答案 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()
要容易得多。您可以看到正在使用的模板。