我想编写一个简单的查询来选择PostgreSQL中的多个列。但是,我一直在收到错误 - 我尝试了一些选项,但它们对我不起作用。目前我收到以下错误:
org.postgresql.util.PSQLException:错误:语法错误在或附近 “列”
要获取具有值的列,请尝试以下操作:
select * from weather_data where column like '%2010%'
有什么想法吗?
答案 0 :(得分:9)
column
是reserved 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语句以返回结果。
答案 2 :(得分: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不提供解析匿名记录的文本表示的工具,因此您可能必须自己编写。< / 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。 希望有一天能帮到某人。