我在尝试执行此操作时遇到此错误:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1
似乎找不到问题所在。感激是否有人可以提供帮助
SET @sql = NULL;
SELECT
GROUP_CONCAT(
DISTINCT CONCAT (
"SUM(IF(DATE(FROM_UNIXTIME(machine_stop)) = '",
DATE(FROM_UNIXTIME(machine_stop)),"' ,
(machine_start-machine_stop)/3600, 0)) AS ",
DATE(FROM_UNIXTIME(machine_stop))
)
) INTO @sql
FROM
downtime_data
WHERE
DATE(FROM_UNIXTIME(machine_stop)) >= DATE(NOW()) - INTERVAL 7 DAY;
SET @sql = CONCAT("SELECT
failure_code, ", @sql, "
FROM
downtime_data
WHERE
p.machine='HH1' AND
DATE(FROM_UNIXTIME(machine_stop)) >= DATE(NOW()) - INTERVAL 7 DAY
GROUP BY
failure_code,
DATE(FROM_UNIXTIME(machine_stop))"
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
最佳答案
如果 @sql
变量在第一个 select 语句之后仍然保持 NULL
值,那么稍后您将在执行 prepare 语句时遇到异常。
看下面使用 CONCAT
的 select 语句
SET @sql := NULL;选择 CONCAT('abc',@sql,'def');
结果为 NULL
。尽管您可能希望结果为 abcdef
。
为了得到abcdef
你需要这样做
SET @sql := NULL; SELECT CONCAT('abc',IFNULL(@sql,''),'def');
如果可以解决问题,您可以尝试以下任一方法:
要么
1) SET @sql := '';
或
2) 如果你想保留这一行 SET @sql = NULL;
然后像这样更改最终查询的部分 SET @sql = CONCAT("SELECT failure_code ", IF (@sql IS NULL, '',CONCAT(',',@sql)),
这是最终的查询:
SET @sql = CONCAT("SELECT
failure_code ", IF(@sql IS NULL, '',CONCAT(',',@sql)), "
FROM
downtime_data
WHERE
p.machine='HH1' AND
DATE(FROM_UNIXTIME(machine_stop)) >= DATE(NOW()) - INTERVAL 7 DAY
GROUP BY
failure_code,
DATE(FROM_UNIXTIME(machine_stop))"
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
关于第 1 行的 mysql 错误 'NULL',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37726751/