2012-02-07 43 views
4

使用交叉表()我有如下表t1報價標記不正確時,在PostgreSQL中

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的條件,這會導致引號不正確。 我該如何解決問題?

回答

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

爲了避免有關如何逃脫單引號和通常簡化的語法混亂,使用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值匯聚和 在行內正確排序。請注意,交叉表本身不會注意查詢結果的第二列 ;只需按 排序即可控制頁面中第三列值的顯示順序。

更多細節: