我们构建了一个动态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,我们返回一个只包含该特定研究的列的表(不同的Terminate为仅用于该研究的列),但是当查询时转为存储过程并运行它生成一个包含所有研究列的表(所有不同的终止为列)。
当作为存储过程运行时,似乎忽略了第一个where子句(在select group_concat中),但是当作为简单查询运行时则不是这种情况。
存储过程调用:
selectPivotedTermpoints('bhp_03a');
有谁知道为什么会出现这种情况和/或我如何纠正这个问题?
答案 0 :(得分:4)
我最近在另一个问题上帮助过有类似问题的人;它混淆了我们很长一段时间。将参数名称更改为其他名称,我猜测WHERE
正在使用它而不是表中的字段。
(您也可以使用Dashboard.studyid
,但更改参数名称会减少混淆;而且@finalSQL中的查询行为也不是肯定的。)< / em>的