体贴的仙人掌 · 朱哲琴:这电影的主角是声音 ...· 4 周前 · |
爱旅游的蛋挞 · 事关广州火车站改造,有最新消息!!!_腾讯新闻· 2 月前 · |
发财的小马驹 · 中国空间站:无缘登月中转站,却是技术试验场· 4 月前 · |
从容的电梯 · 《蜘蛛侠:英雄无归》第二版预告解析!三蛛同框 ...· 9 月前 · |
低调的葡萄酒 · 【东风风光E3】东风风光E3汽车_东风风光E ...· 1 年前 · |
例如,在MS-SQL中,您可以打开一个查询窗口并运行以下命令:
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
在PostgreSQL中如何做到这一点?这是可以做到的吗?
下面是在plpgsql中使用变量的示例:
create table test (id int);
insert into test values (1);
insert into test values (2);
insert into test values (3);
create function test_fn() returns int as $$
declare val int := 2;
begin
return (SELECT id FROM test WHERE id = val);
$$ LANGUAGE plpgsql;
SELECT * FROM test_fn();
test_fn
---------
2
有关更多信息,请查看 plpgsql docs 。
我遇到过一些其他的文档,他们使用
\set
来声明脚本变量,但是值看起来像常量值,我正在寻找一种方法,可以像变量一样工作,而不是常量变量。
例如:
\set Comm 150
select sal, sal+:Comm from emp
这里,
sal
是表'emp‘中的值,
comm
是常量值。
完整答案位于 official PostgreSQL documentation 中。
您可以使用新的PG9.0匿名代码块功能( http://www.postgresql.org/docs/9.1/static/sql-do.html )
DO $$
DECLARE v_List TEXT;
BEGIN
v_List := 'foobar' ;
SELECT *
FROM dbo.PubLists
WHERE Name = v_List;
-- ...
END $$;
您还可以获得最后一个 insert id:
DO $$
DECLARE lastid bigint;
BEGIN
INSERT INTO test (name) VALUES ('Test Name')
RETURNING id INTO lastid;
SELECT * FROM test WHERE id = lastid;
END $$;
您可以使用:
\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;
那个可以
DO $$
DECLARE
a integer := 10;
b integer := 20;
c integer;
BEGIN
c := a + b;
RAISE NOTICE'Value of c: %', c;
END $$;
我不得不做这样的事情
CREATE OR REPLACE FUNCTION MYFUNC()
RETURNS VOID AS $$
BEGIN
DECLARE
myvar int;
$$ LANGUAGE SQL;
Postgresql没有裸变量,你可以使用临时表。变量仅在代码块中可用,或作为用户界面功能。
如果你需要一个空变量,你可以使用一个临时表:
CREATE TEMP TABLE list AS VALUES ('foobar');
SELECT dbo.PubLists.*
FROM dbo.PubLists,list
WHERE Name = list.column1;
在@nad2000的答案和 @Pavel's answer here 的基础上,这就是我的Flyway迁移脚本的终点。处理手动修改数据库架构的情况。
DO $$
BEGIN
IF NOT EXISTS(
SELECT TRUE FROM pg_attribute
WHERE attrelid = (
SELECT c.oid
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE
n.nspname = CURRENT_SCHEMA()
AND c.relname = 'device_ip_lookups'
AND attname = 'active_date'
AND NOT attisdropped
AND attnum > 0
RAISE NOTICE 'ADDING COLUMN';
ALTER TABLE device_ip_lookups
ADD COLUMN active_date TIMESTAMP;
RAISE NOTICE 'SKIPPING, COLUMN ALREADY EXISTS';
END IF;
END $$;