在PostgreSQL的特定列名选择列(Select columns with particular

2019-08-19 08:50发布

我想编写一个简单的查询,PostgreSQL中选择一个号码列。 不过,我不断收到错误 - 我尝试了一些选择,但他们并没有为我工作。 目前,我收到以下错误:

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

要获得值的列我尝试followig:

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

有任何想法吗?

Answer 1:

column是一个保留字 。 你不能把它作为标识,除非你双引号的。 像: "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;

你不能让这个完全动态的,因为返回类型是未知的 ,直到我们真正建立查询。



Answer 2:

这将让你列的列表中的特定表(如果需要的话,你可以选择添加模式):

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

SQL小提琴演示

然后,您可以使用查询来创建一个动态的SQL语句返回结果。



Answer 3:

尝试使用动态结构,如这通常表明您应该使用的数据格式,如hstorejsonxml等是amenible的动态访问权限。

可以通过在应用程序中动态创建的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的动态记录,而不知道他们的结果类型,它只是不是特别有用,这是处理客户端上的一个痛。 你真的想只是用客户端来生成摆在首位的查询。



Answer 4:

无法搜索一样,所有列。 你必须指定一个特定的列。

例如,

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

或者更好的,如果它是一个日期,指定日期范围:

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


Answer 5:

发现这个在这里 :

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查询,你只需要进一步执行。 它适合我的需要,因为我管结果是这样的外壳

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

返回我的格式化输出,但它只是在外壳的作品。 希望这可以帮助别人一天。



文章来源: Select columns with particular column names in PostgreSQL