在PostgreSQL中选择具有特定列名称的列

时间:2013-04-04 00:06:06

标签: sql database postgresql select dynamic-sql

我想编写一个简单的查询来选择PostgreSQL中的多个列。但是,我一直在收到错误 - 我尝试了一些选项,但它们对我不起作用。目前我收到以下错误:

  

org.postgresql.util.PSQLException:错误:语法错误在或附近   “列”

要获取具有值的列,请尝试以下操作:

select * from weather_data where column like '%2010%'

有什么想法吗?

5 个答案:

答案 0 :(得分:9)

columnreserved word。除非您双引号,否则不能将其用作标识符。喜欢:"column"

但这并不意味着你应该这样做。只是不要使用保留字作为标识符。如初。

要......

  

选择名称中包含2010的列列表:

..您可以使用此函数从系统目录表pg_attribute动态构建SQL命令:

CREATE OR REPLACE FUNCTION f_build_select(_tbl regclass, _pattern text)
  RETURNS text AS
$func$
    SELECT format('SELECT %s FROM %s'
                 , string_agg(quote_ident(attname), ', ')
                 , $1)
    FROM   pg_attribute 
    WHERE  attrelid = $1
    AND    attname LIKE ('%' || $2 || '%')
    AND    NOT attisdropped  -- no dropped (dead) columns
    AND    attnum > 0;       -- no system columns
$func$ LANGUAGE sql;

呼叫:

SELECT f_build_select('weather_data', '2010');

返回类似的内容:

SELECT foo2010, bar2010_id, FROM weather_data;

你不能使它完全动态,因为在我们实际构建查询之前,返回类型是 unknown

答案 1 :(得分:6)

这将为您提供特定表中的列列表(如果需要,您可以选择添加模式):

SELECT column_name
FROM information_schema.columns
WHERE table_name = 'yourtable'
  and column_name like '%2010%'

SQL Fiddle Demo

然后,您可以使用该查询创建动态sql语句以返回结果。

答案 2 :(得分:1)

尝试使用这样的动态结构通常表明您应该使用动态访问等hstorejsonxml等数据格式。

您可以通过在应用程序中动态创建SQL来 获取动态列列表。您可以查询INFORMATION_SCHEMA以获取有关表的列的信息并构建查询。

可以在PL / PgSQL中执行此操作并使用EXECUTE运行生成的查询,但您会发现使用结果RECORD有点困难,因为您必须获取并解码复合元组,您无法将结果集展开到普通列列表中。观察:

craig=> CREATE OR REPLACE FUNCTION retrecset() returns setof record as $$
values (1,2,3,4), (10,11,12,13);
$$ language sql;

craig=> select retrecset();
   retrecset   
---------------
 (1,2,3,4)
 (10,11,12,13)
(2 rows)

craig=> select * from retrecset();
ERROR:  a column definition list is required for functions returning "record"

craig=> select (r).* FROM (select retrecset()) AS x(r);
ERROR:  record type has not been registered

您可以做的就是获取原始记录并在客户端中对其进行解码。您无法从SQL索引它,也无法将其转换为其他任何内容等。大多数客户端API不提供解析匿名记录的文本表示的工具,因此您可能必须自己编写。< / p>

所以:你可以从PL / PgSQL返回动态记录而不知道它们的结果类型,它只是没有特别有用,在客户端处理是一件痛苦的事。您真的只想使用客户端来生成查询。

答案 3 :(得分:0)

您无法搜索所有列。您必须指定特定列。

例如,

select * from weather_data where weather_date like '%2010%'

或更好,如果是日期,请指定日期范围:

select * from weather_data where weather_date between '2010-01-01' and '2010-12-31'

答案 4 :(得分:0)

找到此here

SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name
        FROM information_schema.columns As c
            WHERE table_name = 'officepark' 
            AND  c.column_name NOT IN('officeparkid', 'contractor')
    ), ',') || ' FROM officepark As o' As sqlstmt

结果是您必须进一步执行的SQL SELECT查询。 它符合我的需要,因为我将结果传递给shell ,如下所示:

psql -U myUser -d myDB -t -c "SELECT...As sqlstm" | psql -U myUser -d myDB

它返回格式化输出,但它只适用于shell。 希望有一天能帮到某人。