Неправильная кавычка при использовании crosstab () в PostgreSQL - PullRequest
5 голосов
/ 07 февраля 2012

У меня есть таблица 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'

Теперь я хочу использовать функцию кросс-таблицы для извлечения 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)

Моя проблема в том, что, как вы видите, SQL в crosstab() содержит условие item_name, что приведет к кавычкамбыть неверным.Как мне решить проблему?

Ответы [ 2 ]

16 голосов
/ 07 февраля 2012

Чтобы избежать путаницы в том, как избежать одинарных кавычек и вообще упростить синтаксис, используйте цитирование в долларах для строки запроса:

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 к вашей строке запроса.Я цитирую руководство для модуля tablefunc :

На практике SQL-запрос всегда должен указывать ORDER BY 1,2, чтобы гарантировать, что входные строки правильно упорядочены, то есть значения содно и то же row_name собраны и правильно упорядочены в строке.Обратите внимание, что сама кросс-таблица не обращает внимания на второй столбец результата запроса;он просто должен быть упорядочен для управления порядком отображения значений в третьем столбце на странице.

Подробнее:

3 голосов
/ 07 февраля 2012

Удвойте одинарные кавычки, чтобы избежать их:

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)
...