我们构建了一段动态 SQL,可以从长格式的数据中生成宽视图。看到这里:
CREATE PROCEDURE `selectPivotedTermpoints`(studyid varchar(300))
BEGIN
SET SESSION group_concat_max_len = 10000000;
SET @psql = NULL;
SET @finalSQL = NULL;
SET @StudyID = studyid;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT('SUM(CASE WHEN terminate = ''', REPLACE(Terminate,'''', ''''''), ''' THEN 1 ELSE 0 END) AS `', REPLACE(Terminate,'''', ''), '`')
) INTO @psql
FROM Dashboard
WHERE studyid = @StudyID
AND completion_status = 'terminate';
SET @finalSQL = CONCAT('
SELECT Sample_provider as Provider,
completion_status as `Status`,',
@psql,'
FROM Dashboard
WHERE studyid = ''', @StudyID, '''
AND completion_status = ''terminate''
GROUP BY Sample_provider');
SELECT @finalSQL;
PREPARE stmt FROM @finalSQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
当sql作为查询运行时,(从SET到DEALLOCATE)手动设置@StudyID,我们返回一个仅包含该特定研究的列的表(仅作为该研究的不同终止列),但是当查询转向时进入存储过程并运行它,生成一个包含所有研究列的表(所有不同的终止为列)。
作为存储过程运行时,第一个 where 子句(在 select group_concat 中)似乎被忽略,但作为简单查询运行时,情况并非如此。
存储过程调用:
selectPivotedTermpoints('bhp_03a');
有谁知道为什么会出现这种情况和/或我如何纠正这个问题?
我最近在另一个问题中帮助了遇到类似问题的人;这让我们困惑了很长一段时间。将参数名称更改为其他名称,我猜测
WHERE
正在使用它而不是表中的字段。
(你也许也可以摆脱
Dashboard.studyid
,但更改参数名称会减少混乱;而且我也不确定@finalSQL中的查询将如何表现。)
@Uueerdo,非常感谢。这让 SQL 引擎感到困惑。