【问题标题】:Quotation mark incorrect when using crosstab() in PostgreSQL在 PostgreSQL 中使用 crosstab() 时引号不正确
【发布时间】:2012-02-28 12:20:02
【问题描述】:

我有一张桌子t1 如下:

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

这张表有5条记录:

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'

现在我想用crosstab函数提取NAME,GENDER数据,所以我写了一个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 的条件,这将导致引号不正确。 我该如何解决这个问题?

【问题讨论】:

    标签: postgresql pivot quotes crosstab


    【解决方案1】:

    为避免对如何转义单引号造成任何混淆并通常简化语法,请使用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 放在一起并在 排。请注意,交叉表本身并不关注 查询结果的第二列;它只是在那里订购, 控制第三列值在页面中出现的顺序。

    更多细节:

    【讨论】:

      【解决方案2】:

      双引号将它们转义:

      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)
      

      【讨论】:

        猜你喜欢
        • 2013-11-15
        • 2011-01-26
        • 2022-01-05
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-14
        相关资源
        最近更新 更多