当字段有空格时,MySQL预处理语句不起作用

时间:2014-11-03 22:17:16

标签: mysql dynamic prepared-statement

我正在尝试创建以下预准备语句,该语句将为数据透视表输出动态行。如果'Name'字段没有空格,我的声明有效。但是,当我向其添加空格(例如,项目强度站点协调员)时,我收到以下错误:

  

“您的SQL语法有错误;请查看手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近'Strength Site Coordinator,MAX(IF(Name =   'TeenEatsSiteCoordinator',Name,NULL))'在第1行:PREPARE stmt FROM   @sql“

我尝试过研究这个问题但没有发现任何东西。

这是SQL Fiddle

感谢您提供任何帮助!

CREATE TABLE `Contacts` (
  `Contact_Id` int(11) unsigned NOT NULL,
  `First_Name` varchar(50) NOT NULL,
  `Last_Name` varchar(50) NOT NULL
);

insert into Contacts values (1, 'John', 'Doe');
insert into Contacts values (2, 'Jane', 'Doe');

CREATE TABLE `Contact_Types` (
  `Contact_Type_Id` int(11) unsigned NOT NULL,
  `Name` varchar(50) NOT NULL
);

insert into Contact_Types values (1, 'ProjectStrengthSiteCoordinator');
insert into Contact_Types values (2, 'TeenEatsSiteCoordinator');

CREATE TABLE `Contacts_Contact_Types` (
  `Contact_Id` int(11) unsigned NOT NULL DEFAULT '0',
  `Contact_Type_Id` int(11) unsigned NOT NULL DEFAULT '0'
);

insert into Contacts_Contact_Types values (1, 1);
insert into Contacts_Contact_Types values (1, 2);
insert into Contacts_Contact_Types values (2, 1);

SET @sql = NULL;

SELECT
 GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(Name = ''',
      Name,
      ''', Name, NULL)) AS ',
      Name
    )
  ) INTO @sql
from Contact_Types;

SET @sql = CONCAT('SELECT c.First_Name, ', @sql, ' from Contacts c
left join Contacts_Contact_Types cct
  on c.Contact_Id = cct.Contact_Id
left join Contact_Types ct
  on cct.Contact_Type_Id = ct.Contact_Type_Id
group by c.Contact_Id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

1 个答案:

答案 0 :(得分:1)

您需要在as部分中将其转义:

SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(Name = ''', Name, ''', Name, NULL)) AS `', Name, '`'
                                   )
                   ) INTO @sql
from Contact_Types;

请注意group_concat()需要多个参数,因此严格来说,嵌套的concat()是不必要的。