在PostgreSQL中使用crosstab()时,引号不正确

时间:2012-02-07 01:58:03

标签: postgresql pivot quotes crosstab

我有一张表t1,如下所示:

create table t1 (
  person_id int,
  item_name varchar(30),
  item_value varchar(100)
);

此表中有五条记录:

person_id | item_name | item_value
   1        'NAME'      'john'
   1        'GENDER'    'M'
   1        'DOB'       '1970/02/01'
   1        'M_PHONE'   '1234567890'
   1        'ADDRESS'   'Some Addresses unknown'

现在我想使用交叉表函数来提取NAMEGENDER数据,所以我写了一个SQL:

select * from crosstab(
  'select person_id, item_name, item_value from t1 
   where person_id=1 and item_name in ('NAME', 'GENDER') ') 
as virtual_table (person_id int, NAME varchar, GENDER varchar)

我的问题是,如您所见crosstab()中的SQL包含item_name的条件,这将导致引号不正确。 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:16)

为避免混淆如何转义单引号并通常简化语法,请使用dollar-quoting作为查询字符串:

SELECT *
FROM   crosstab($$
    SELECT person_id, item_name, item_value
    FROM   t1 
    WHERE  person_id = 1
    AND    item_name IN ('NAME', 'GENDER')
    $$) AS virtual_table (person_id int, name varchar, gender varchar)

您应该在查询字符串中添加ORDER BY。我引用the manual for the tablefunc module

  

实际上,SQL查询应始终指定ORDER BY 1,2以确保   输入行是否正确排序,即带有的值   将相同的row_name放在一起并在其中正确排序   行。请注意,交叉表本身并没有注意到   查询结果的第二列;它只是在那里订购,   控制第三列值在页面中出现的顺序。

更多详情:

答案 1 :(得分:3)

将单引号加倍以逃避它们:

select * from crosstab(
  'select person_id, item_name, item_value from t1 
   where person_id=1 and item_name in (''NAME'', ''GENDER'') ') 
as virtual_table (person_id int, NAME varchar, GENDER varchar)