我想编写一个简单的查询,PostgreSQL中选择一个号码列。 不过,我不断收到错误 - 我尝试了一些选择,但他们并没有为我工作。 目前,我收到以下错误:
org.postgresql.util.PSQLException:错误:在语法错误或接近“列”
要获得值的列我尝试followig:
select * from weather_data where column like '%2010%'
有任何想法吗?
我想编写一个简单的查询,PostgreSQL中选择一个号码列。 不过,我不断收到错误 - 我尝试了一些选择,但他们并没有为我工作。 目前,我收到以下错误:
org.postgresql.util.PSQLException:错误:在语法错误或接近“列”
要获得值的列我尝试followig:
select * from weather_data where column like '%2010%'
有任何想法吗?
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;
你不能让这个完全动态的,因为返回类型是未知的 ,直到我们真正建立查询。
这将让你列的列表中的特定表(如果需要的话,你可以选择添加模式):
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'yourtable'
and column_name like '%2010%'
SQL小提琴演示
然后,您可以使用查询来创建一个动态的SQL语句返回结果。
尝试使用动态结构,如这通常表明您应该使用的数据格式,如hstore
, json
, xml
等是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的动态记录,而不知道他们的结果类型,它只是不是特别有用,这是处理客户端上的一个痛。 你真的想只是用客户端来生成摆在首位的查询。
无法搜索一样,所有列。 你必须指定一个特定的列。
例如,
select * from weather_data where weather_date like '%2010%'
或者更好的,如果它是一个日期,指定日期范围:
select * from weather_data where weather_date between '2010-01-01' and '2010-12-31'
发现这个在这里 :
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
返回我的格式化输出,但它只是在外壳的作品。 希望这可以帮助别人一天。