12

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

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

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

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

有任何想法吗?

4

5 回答 5

15

column是一个保留字。除非双引号,否则不能将其用作标识符。喜欢:"column"

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

到 ...

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

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

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;

您不能使其完全动态化,因为在我们实际构建查询之前返回类型是未知的。

于 2013-04-04T00:18:42.777 回答
7

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

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

SQL 小提琴演示

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

于 2013-04-04T00:27:03.290 回答
1

尝试使用像这样的动态结构通常表明您应该使用适合动态访问的数据格式,如hstore, json,等。xml

可以通过在应用程序中动态创建 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 不提供解析匿名记录的文本表示的工具,因此您可能必须自己编写。

所以:你可以在不知道结果类型的情况下从 PL/PgSQL 返回动态记录,这并不是特别有用,而且在客户端处理起来很痛苦。您真的只想首先使用客户端生成查询。

于 2013-04-04T00:30:21.087 回答
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'
于 2013-04-04T00:12:36.030 回答
0

在这里找到这个:

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。希望有一天这对某人有所帮助。

于 2015-10-12T09:47:15.250 回答