1

我有一种情况,每个 SQL 查询都很好,但当我将它们粘贴在一起时就不行了。

我有两张桌子。一种是动态的,允许 NULL 值。另一个通过向用户提供问题来帮助填充空值。我从动态表中获取列名,看看是否可以让它们与其他问题表中的字段匹配。目前,我们有这个工作的 PHP,但我一直在尝试将它全部放入我们的 PostgreSQL 数据库中。

这会从动态表中获取所有列名并返回逗号分隔的字符串列表。

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

它工作得很好,并返回类似:'notificationemail','birthdate','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 有何不同。它似乎是有道理的,但显然,动态列表和静态文本有所不同。

编辑:谢谢!我想我想太多了。通过不将其设为字符串列表并将其保留为对象,它立即起作用。

4

3 回答 3

1
select *
FROM questions_table
WHERE questioncolumn IN (
    select quote_literal(column_name::text)
    from information_schema.columns
    where table_name='dynamic_table'
);
于 2013-05-04T22:28:43.727 回答
1

我认为这可能是您正在寻找的东西:

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

SQL 小提琴演示

于 2013-05-04T22:28:57.337 回答
1

IN 子句需要一个临时表,而不是逗号分隔值的字符串。

select * FROM questions_table WHERE questioncolumn IN   
select column_name from
information_schema.columns where table_name='dynamic_table';
于 2013-05-04T22:29:12.343 回答