2013-05-04 63 views
1

我有其中一種情況,其中每個SQL查詢都很好用,但不是在將它們粘貼在一起時。SQL列名稱並將它們與PostgreSQL中另一個表中的行記錄進行比較

我有兩個表。一種是允許NULL值的動態。另一個有助於通過向用戶提供問題來填充空值。我從動態表中獲取列名並查看是否可以讓它們與其他問題表中的字段匹配。目前,我們有這個可用的PHP,但我一直在嘗試將它們全部放到我們的PostgreSQL數據庫中。

這將從動態表中獲取所有列名稱並返回逗號分隔的字符串列表。

select array_to_string(array_agg(quote_literal(column_name::text)),',') from 
information_schema.columns where table_name='dynamic_table'; 

它的偉大工程,並返回是這樣的:「notificationemail」,「生日」,「lastnotificationcheck」,「createmethod」

如果我直接粘貼此列表到我的下一個查詢,它的工作原理和回報行:

select * FROM questions_table WHERE questioncolumn IN 
('notificationemail','birthdate','lastnotificationcheck','createmethod'); 

現在,一旦我把它們粘貼在一起,我得到的運行,但不返回行的東西:

select * FROM questions_table WHERE questioncolumn IN 
(select array_to_string(array_agg(quote_literal(column_name::text)),',') from 
information_schema.columns where table_name='dynamic_table'); 

我想確定靜態文本字段與IN語句中嵌入式SELECT的不同之處。這似乎是有道理的,但顯然,與動態列表和靜態文本有所不同。編輯: 謝謝!我想我是在思考事情。通過不使它成爲一個字符串列表並將它保留爲一個對象,它就可以馬上使用。

回答

1

我認爲這可能是你在找什麼,而不是:

select * 
FROM questions_table 
WHERE questioncolumn IN 
(
    select column_name 
    from information_schema.columns where table_name='dynamic_table' 
); 

SQL Fiddle Demo

1
select * 
FROM questions_table 
WHERE questioncolumn IN (
    select quote_literal(column_name::text) 
    from information_schema.columns 
    where table_name='dynamic_table' 
); 
1

IN子句需要一個短暫的表,而不是逗號分隔值的字符串。

select * FROM questions_table WHERE questioncolumn IN 
select column_name from 
information_schema.columns where table_name='dynamic_table'; 
相關問題