相关疑难解决方法(0)

选择随机行PostgreSQL的最佳方法

我想在PostgreSQL中随机选择一行,我试过这个:

select * from table where random() < 0.01;
Run Code Online (Sandbox Code Playgroud)

但其他一些人推荐这个:

select * from table order by random() limit 1000;
Run Code Online (Sandbox Code Playgroud)

我有一个非常大的表,有5亿行,我希望它快.

哪种方法更好?有什么区别?选择随机行的最佳方法是什么?

sql random postgresql performance

311
推荐指数
9
解决办法
19万
查看次数

PostgreSQL列名称区分大小写吗?

我有一个db表说,persons在Postgres中由另一个有列名称的团队传下来,"first_Name".现在我正在尝试使用PG指令器在此列名称上查询此表.

select * from persons where first_Name="xyz";
Run Code Online (Sandbox Code Playgroud)

它只是回归

错误:列"first_Name"不存在

不确定我是在做一些愚蠢的事情,还是我找不到这个问题的解决方法?

sql postgresql case-sensitive case-insensitive identifier

138
推荐指数
3
解决办法
9万
查看次数

如何在PostgreSQL中的函数内返回SELECT的结果?

我在PostgreSQL中有这个功能,但我不知道如何返回查询结果:

CREATE OR REPLACE FUNCTION wordFrequency(maxTokens INTEGER)
  RETURNS SETOF RECORD AS
$$
BEGIN
    SELECT text, count(*), 100 / maxTokens * count(*)
    FROM (
        SELECT text
    FROM token
    WHERE chartype = 'ALPHABETIC'
    LIMIT maxTokens
    ) as tokens
    GROUP BY text
    ORDER BY count DESC
END
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在PostgreSQL函数中返回查询结果.

我发现返回类型应该是SETOF RECORD,对吗?但是返回命令不对.

这样做的正确方法是什么?

sql postgresql return return-type plpgsql

92
推荐指数
2
解决办法
14万
查看次数

表名作为PostgreSQL函数参数

我想在Postgres函数中传递一个表名作为参数.我试过这段代码:

CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer 
AS $$
    BEGIN
    IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN
     return 1;
    END IF;
    return 0;
    END;
$$ LANGUAGE plpgsql;

select some_f('table_name');
Run Code Online (Sandbox Code Playgroud)

我得到了这个:

ERROR:  syntax error at or near "."
LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)...
                                                             ^

********** Error **********

ERROR: syntax error at or near "."
Run Code Online (Sandbox Code Playgroud)

以下是更改为此时出现的错误select * from quote_ident($1) tab where tab.id=1:

ERROR:  column tab.id does not exist
LINE 1: ...T EXISTS …
Run Code Online (Sandbox Code Playgroud)

postgresql function dynamic-sql plpgsql identifier

69
推荐指数
4
解决办法
7万
查看次数

使用PL/pgSQL将多个字段作为PostgreSQL中的记录返回

我正在使用PL/pgSQL编写SP.
我想返回一个记录,由几个不同的表中的字段组成.看起来像这样:

CREATE OR REPLACE FUNCTION get_object_fields(name text)
  RETURNS RECORD AS $$
BEGIN
  -- fetch fields f1, f2 and f3 from table t1
  -- fetch fields f4, f5 from table t2
  -- fetch fields f6, f7 and f8 from table t3
  -- return fields f1 ... f8 as a record
END
$$ language plpgsql; 
Run Code Online (Sandbox Code Playgroud)

如何将不同表中的字段作为单个记录中的字段返回?

[编辑]

我已经意识到我上面给出的例子有点过于简单了.我需要检索的一些字段将被保存为要查询的数据库表中的单独行,但我想在"展平"记录结构中返回它们.

下面的代码应该有助于进一步说明:

CREATE TABLE user (id int, school_id int, name varchar(32));

CREATE TYPE my_type (
  user1_id   int,
  user1_name varchar(32),
  user2_id   int,
  user2_name varchar(32)
); …
Run Code Online (Sandbox Code Playgroud)

sql postgresql types stored-procedures plpgsql

64
推荐指数
4
解决办法
14万
查看次数

search_path如何影响标识符解析和"当前架构"

是否可以定义默认情况下创建新表的模式?(由"不合格的表名称"引用.)

我已经看到了在Postgres中使用"搜索路径"的一些细节,但我认为它只在检索数据时有效,而不是创建.

我有一堆SQL脚本,它们创建了许多表.我没有修改脚本,而是希望默认情况下在特定模式中设置数据库创建表 - 当它们具有非限定名称时.

这可能吗?

postgresql schema search-path database-table

46
推荐指数
2
解决办法
3万
查看次数

PostgreSQL:错误:42601:返回"记录"的函数需要列定义列表

(免责声明:PostgreSQL新手.)

好吧,据我所知,我的功能与我见过的样本非常相似.有人能否告诉我如何让这个工作?

create or replace function get_user_by_username(
    username varchar(250),
    online boolean
    ) returns setof record as $$
declare result record;
begin

    if online then 
        update users
        set last_activity = current_timestamp
        where user_name = username;
    end if;

    return query
    select
        user_id,
        user_name,
        last_activity,
        created,
        email,
        approved,
        last_lockout,
        last_login,
        last_password_changed,
        password_question,
        comment
    from
        users
    where
        user_name = username
    limit 1;

    return;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

36
推荐指数
2
解决办法
4万
查看次数

使用CASE和GROUP BY进行数据透视的动态替代方法

我有一个看起来像这样的表:

id    feh    bar
1     10     A
2     20     A
3      3     B
4      4     B
5      5     C
6      6     D
7      7     D
8      8     D
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

bar  val1   val2   val3
A     10     20 
B      3      4 
C      5        
D      6      7     8
Run Code Online (Sandbox Code Playgroud)

我有这个查询,它执行此操作:

SELECT bar, 
   MAX(CASE WHEN abc."row" = 1 THEN feh ELSE NULL END) AS "val1",
   MAX(CASE WHEN abc."row" = 2 THEN feh ELSE NULL END) AS "val2",
   MAX(CASE WHEN abc."row" = 3 THEN feh ELSE …
Run Code Online (Sandbox Code Playgroud)

sql postgresql pivot crosstab window-functions

26
推荐指数
4
解决办法
3万
查看次数

为PostgreSQL中的记录变量动态传递列名

使用PostgreSQL,第一条记录的表中的列值存储在记录变量中.例如:让变量为:recordvar

recordvar.columnname
Run Code Online (Sandbox Code Playgroud)

给出指定列名的值.我将columname在变量中定义:

var := columnname
Run Code Online (Sandbox Code Playgroud)

在地方columnname,如果我与变量如更换recordvar.var,这是行不通的.

请让我知道如何处理这种情况.以下是示例代码:

CREATE OR REPLACE FUNCTION getrowdata(id numeric, table_name character varying)
RETURNS SETOF void AS
$BODY$ 
DECLARE

srowdata record;
reqfield character varying;
value numeric;


BEGIN

RAISE NOTICE 'id: %',id; 
reqfield:= 'columnname';

EXECUTE 'select * from datas.'||table_name||' WHERE id = '||id into srowdata;

RAISE NOTICE 'srowdata: %',srowdata; 

RAISE NOTICE 'srowdatadata.columnname: %',srowdata.columnname;

value:= srowdata.reqfield;

RAISE NOTICE 'value: %',value;


END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
Run Code Online (Sandbox Code Playgroud)

postgresql types dynamic-sql plpgsql hstore

17
推荐指数
1
解决办法
2万
查看次数

从PL/pgSQL函数返回包含未知列的动态表

我需要创建一个函数,检查给定的表是否infowindow存在该字段.如果它存在,则函数必须返回select * from table但如果不存在,则必须返回一个附加id字段:

CREATE OR REPLACE FUNCTION getxo_ocx_cincu_preparar_infowindow(
                                              guretabla character varying)
  RETURNS TABLE AS
$BODY$ 
DECLARE
    tabla ALIAS FOR $1;

BEGIN

IF  EXISTS (SELECT 1
   FROM   pg_namespace n
   JOIN   pg_class     c ON c.relnamespace = n.oid
   JOIN   pg_attribute a ON a.attrelid = c.oid 
   WHERE  n.nspname = current_schema()  -- default to current schema
   AND    c.relname = tabla
   AND    a.attname = 'infowindow'
   AND    NOT a.attisdropped)
THEN
    RETURN QUERY EXECUTE 'SELECT * from ' ||tabla ;
ELSE …
Run Code Online (Sandbox Code Playgroud)

postgresql polymorphism return-type dynamic-sql plpgsql

13
推荐指数
1
解决办法
1万
查看次数