我使用emacs来编辑我的sql代码.我99%的时间都在postgresql plpgsql代码上工作.扩展名为.sql的所有文件都包含postgresql.我很好奇有没有办法设置sql-highlight-postgres-keywords SQL突出显示默认值而不是ANSI SQL,因为每次打开文件时切换模式都很烦人.
我有一个sql函数,它执行一个简单的sql select语句:
CREATE OR REPLACE FUNCTION getStuff(param character varying)
RETURNS SETOF stuff AS
$BODY$
select *
from stuff
where col = $1
$BODY$
LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)
现在我调用这个函数是这样的:
select * from getStuff('hello');
Run Code Online (Sandbox Code Playgroud)
如果我需要订购并限制结果order by和limit条款,我有哪些选择?
我想这样的查询:
select * from getStuff('hello') order by col2 limit 100;
Run Code Online (Sandbox Code Playgroud)
效率不高,因为表中的所有行都stuff将由函数返回,getStuff然后按限制排序和切片.
但即使我是对的,如何通过sql语言函数的参数传递顺序也没有简单的方法.只能传递值,而不能传递sql语句的一部分.
另一种选择是用plpgsql语言创建函数,在那里可以构造查询并通过它来执行EXECUTE.但这也不是一个非常好的方法.
那么,有没有其他方法可以实现这一目标?或者你会选择什么选择?在函数外部订购/限制,还是plpgsql?
我正在使用postgresql 9.1.
我修改了CREATE FUNCTION语句,如下所示:
CREATE OR REPLACE FUNCTION getStuff(param character varying, orderby character varying)
RETURNS SETOF stuff AS
$BODY$
select t.* …Run Code Online (Sandbox Code Playgroud) 我想将以下SQL代码从MS SQL-Server移植到PostgreSQL.
DECLARE @iStartYear integer
DECLARE @iStartMonth integer
DECLARE @iEndYear integer
DECLARE @iEndMonth integer
SET @iStartYear = 2012
SET @iStartMonth = 4
SET @iEndYear = 2016
SET @iEndMonth = 1
;WITH CTE
AS
(
SELECT
--@iStartYear AS TheStartYear
@iStartMonth AS TheRunningMonth
,@iStartYear AS TheYear
,@iStartMonth AS TheMonth
UNION ALL
SELECT
--CTE.TheStartYear AS TheStartYear
--@iStartYear AS TheStartYear
CTE.TheRunningMonth + 1 AS TheRunningMonth
--,CTE.TheStartYear + (CTE.TheRunningMonth / 12) AS TheYear
,@iStartYear + (CTE.TheRunningMonth / 12) AS TheYear
,(CTE.TheMonth + 1 -1) % …Run Code Online (Sandbox Code Playgroud) 如何break在PostgreSQL中使用该语句?我有这样的结构:
for()
{
for()
{
if(somecondition)
break;
}
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,它应该只打破内for循环?
它必须简单,但我正在迈出Postgres函数的第一步,我找不到任何有效的东西......
我想创建一个修改表和/或列的函数,我找不到在我的函数中指定我的表和列作为参数的正确方法.
就像是:
CREATE OR REPLACE FUNCTION foo(t table)
RETURNS void AS $$
BEGIN
alter table t add column c1 varchar(20);
alter table t add column c2 varchar(20);
alter table t add column c3 varchar(20);
alter table t add column c4 varchar(20);
END;
$$ LANGUAGE PLPGSQL;
select foo(some_table)
Run Code Online (Sandbox Code Playgroud)
在另一种情况下,我想要一个改变某个表中某个列的函数:
CREATE OR REPLACE FUNCTION foo(t table, c column)
RETURNS void AS $$
BEGIN
UPDATE t SET c = "This is a test";
END;
$$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)
有可能吗?
我一直在查看postgresql触发器的文档,但它似乎只显示行级触发器的示例,但我找不到语句级触发器的示例.
特别是,如何在单个语句中迭代更新/插入行并不是很清楚,因为它NEW是针对单个记录的.
我想使用一个sql命令/查询从同一个数据库中删除所有共享相同前缀('supenh_agk')的表.
如何将存储在记录类型变量中的查询结果用于同一存储函数中的另一个查询?我使用Postgres 9.4.4.
用这样的表:
create table test (id int, tags text[]);
insert into test values (1,'{a,b,c}'),
(2,'{c,d,e}');
Run Code Online (Sandbox Code Playgroud)
我写了一个函数(简化),如下所示:
CREATE OR REPLACE FUNCTION func(_tbl regclass)
RETURNS TABLE (t TEXT[], e TEXT[])
LANGUAGE plpgsql AS $$
DECLARE
t RECORD;
c INT;
BEGIN
EXECUTE format('SELECT id, tags FROM %s', _tbl) INTO t;
SELECT count(*) FROM t INTO c;
RAISE NOTICE '% results', c;
SELECT * FROM t;
END
$$;
Run Code Online (Sandbox Code Playgroud)
......但没有奏效:
select func('test');
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)ERROR: 42P01: relation "t" does not exist LINE 1: SELECT count(*) FROM …
我们不能CASE在SQL SELECT语句之外使用条件吗?
例如:
CASE
WHEN old.applies_to = 'admin' THEN _applies_to = 'My Self'
ELSE _applies_to = initcap(old.applies_to)
END
_summary = _summary || '<li>Apply To: ' || _applies_to || '</li>';
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ERROR: syntax error at or near "_summary"
LINE 86: _summary = _summary || '<li>Apply To: ' || _applies ...
Run Code Online (Sandbox Code Playgroud) 在PL/pgSQL上执行和执行有什么区别?
从手册:
有时,评估表达式或SELECT查询但丢弃结果很有用,例如在调用具有副作用但没有有用结果值的函数时.要在PL/pgSQL中执行此操作,请使用PERFORM语句.
但是,当我尝试这样的事情时:
perform 'create table foo as (select 1)';
Run Code Online (Sandbox Code Playgroud)
什么都没发生.虽然此查询应该有副作用(创建表),但结果可以被丢弃.
我想我有一件事是正确的:为了运行我可以使用的函数:
perform pg_temp.addInheritance(foo);
Run Code Online (Sandbox Code Playgroud) plpgsql ×10
postgresql ×10
dynamic-sql ×3
sql ×3
function ×2
variables ×2
break ×1
case ×1
conditional ×1
database ×1
emacs ×1
loops ×1
triggers ×1