如果我们在列值中有空格,则过程给出错误

时间:2014-05-19 08:19:46

标签: mysql

我有以下数据库表: 表名 - dim_module

id       Creation_Date         Goals  Alternative    Value
-----------------------------------------------------------
1   2014-04-17 10:09:30         G1         A         0.86
2   2014-04-17 10:09:30         G1         B         0.87
3   2014-04-17 10:09:30         G2         A         0.5
4   2014-04-17 10:09:30         G2         B         0

我正在使用以下程序获取所需的输出

CREATE DEFINER=`root`@`localhost` PROCEDURE `stmt`()
BEGIN
SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(goals = ''',
      goals,
      ''', round(value, 2), NULL)) AS ',
      goals
    )
  ) INTO @sql
FROM sgwebdb.dim_module;
SET @sql = CONCAT('SELECT alternative, ', @sql, ' FROM sgwebdb.dim_module GROUP BY alternative');

prepare stmt from @sql;

END

我通过上述程序获得低于输出。

Alternative    G1       G2
-----------------------------
 A            0.86      0.50    
 B            0.87      0.00

但是如果目标列值在第一个表(dim_module)中有空格,那么G1就是G 1 检查下表中的第一行目标列。

id Creation_Date目标替代值     -------------------------------------------------- ---------     1 2014-04-17 10:09:30 G 1 A 0.86     2 2014-04-17 10:09:30 G1 B 0.87     3 2014-04-17 10:09:30 G2 A 0.5     4 2014-04-17 10:09:30 G2 B 0

然后它给出了以下错误

Error Code: 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 '1,MAX(IF(goals = 'Goal1', round(value, 2), NULL)) AS Goal1,MAX(IF(goals = 'Goal2' at line 1

请帮我解决此错误。

2 个答案:

答案 0 :(得分:4)

要在字段名称中使用空格,您需要使用反引号来引用它们;

替换

  ''', round(value, 2), NULL)) AS ',                 -- Will use field name G 1, breaks
  goals

  ''', round(value, 2), NULL)) AS `',                -- Will use field name `G 1`, works
  goals, '`'

将引用字段名称并允许空格。

答案 1 :(得分:1)

我认为AS关键字后面的字段名称存在问题。如果字段名称中包含空格,则应引用它。试试这个:

CONCAT(
  'MAX(IF(goals = ''',
  goals,
  ''', round(value, 2), NULL)) AS ',
  '`', goals,'`'
)