我有一张表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)
我的问题是,如您所见crosstab()
中的SQL包含item_name
的条件,这将导致引号不正确。
我该如何解决这个问题?
答案 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)