我想在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亿行,我希望它快.
哪种方法更好?有什么区别?选择随机行的最佳方法是什么?
我想在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) begin;
create type public.ltree as (a int, b int);
create table public.parent_tree(parent_id int,l_tree ltree);
insert into public.parent_tree values(1,(2,2)),(2,(1,2)),(3, (1,28));
commit;
Run Code Online (Sandbox Code Playgroud)
尝试复制此答案中的解决方案:
对于复合类型的函数:
CREATE OR REPLACE FUNCTION public.get_parent_ltree
(_parent_id int, tbl_name regclass , OUT _l_tree ltree)
LANGUAGE plpgsql AS
$func$
BEGIN
EXECUTE format('SELECT l_tree FROM %s WHERE parent_id = $1', tbl_name)
INTO _l_tree
USING _parent_id;
END
$func$;
Run Code Online (Sandbox Code Playgroud)
执行的有效查询:
select l_tree from parent_tree where parent_id = 1;
Run Code Online (Sandbox Code Playgroud)
执行函数:
select get_parent_ltree(1,'parent_tree');
select get_parent_ltree(1,'public.parent_tree');
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
begin;
create type …Run Code Online (Sandbox Code Playgroud) 我正在尝试动态分区Postgres中的日志条目.我有53个子表(每周有1个日志条目),并希望使用触发器将INSERT路由到子表.
我运行该函数INSERT INTO log5 VALUES (NEW.*),它的工作原理.
我用EXECUTE语句运行函数,但它失败了.在EXECUTE语句中,它识别NEW为表名而不是传递给触发器函数的变量.有关如何修复的任何想法?谢谢!
错误:
QUERY:INSERT INTO log5 VALUES(NEW.*)
CONTEXT:PL/pgSQL函数log_roll_test()EXECUTE语句中的第6行
错误:缺少表"new"的FROM子句条目SQL状态:42P01
我的功能:
CREATE FUNCTION log_roll_test() RETURNS trigger AS $body$
DECLARE t text;
BEGIN
t := 'log' || extract(week FROM NEW.updt_ts); --child table name
--INSERT INTO log5 VALUES (NEW.*);
EXECUTE format('INSERT INTO %I VALUES (NEW.*);', t);
RETURN NULL;
END;
$body$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我的触发器:
CREATE TRIGGER log_roll_test
BEFORE INSERT ON log FOR EACH ROW
EXECUTE PROCEDURE log_roll_test();
Run Code Online (Sandbox Code Playgroud) 按照此链接中提到的方法,我想ORDER BY动态地传递和排序函数。
ORDER BY工作正常,但我无法通过排序顺序(ASC/ DESC)。
我现在所拥有的:
CREATE OR REPLACE FUNCTION list(_limit integer,_offset integer,sort_by varchar(100), _order varchar(100),_category varchar(100))
RETURNS TABLE(
id INTEGER,
name VARCHAR,
clientname VARCHAR,
totalcount BIGINT
) AS $$
DECLARE empty text := '';
BEGIN
RETURN Query EXECUTE
'SELECT d.id,
d.name,
d.clientname,
count(*) OVER() AS full_count FROM design_list as d
where ($5 = $6 Or d.category Ilike $5)
ORDER BY ' || quote_ident(sort_by) || ' LIMIT $1 offset $2'
USING _limit,_offset,sort_by, …Run Code Online (Sandbox Code Playgroud) postgresql ×5
plpgsql ×4
dynamic-sql ×3
function ×1
identifier ×1
performance ×1
random ×1
rowtype ×1
sql ×1
sql-order-by ×1
triggers ×1