我需要有关postgress查询的帮助,我正在尝试检查列是否具有值并进行插入
我在本地有两个数据库,在服务器上 并且在此表ccpt_data.user_role_permission在user_role_name列中,我具有权限:
Locally I have this query and works :
INSERT INTO ccpt_data.user_role_permission(user_role_name, permission_name)
VALUES ('manager','MANAGE_SENSITIVE_DATA');
For the server will be something
INSERT INTO ccpt_data.user_role_permission(user_role_name, permission_name)
VALUES ('ROLE_PROJECT_MANAGER','MANAGE_SENSITIVE_DATA');
但是我不能这样做,所以我需要if-else条件,例如 如果在user_role_name中的ccpt_data.user_role_permission上有一个经理,我将执行此操作,否则将执行其他操作,因此我正在尝试某些操作,但由于我不了解Postgres,我需要一些帮助。 我正在尝试:
DO
$do$
BEGIN
IF EXISTS (SELECT FROM ccpt_data.user_role_permission Where user_role_name = manager ) THEN
INSERT INTO ccpt_data.user_role_permission(user_role_name, permission_name)
VALUES ('ROLE_PROJECT_MANAGER','MANAGE_SENSITIVE_DATA');
ELSE
INSERT INTO ccpt_data.user_role_permission(user_role_name, permission_name)
VALUES ('manager','MANAGE_SENSITIVE_DATA');
END IF;
END
$do$
答案 0 :(得分:0)
除了缺少SELECT
和FROM
之间的内容以及您需要在引号中加上manager
之外,我看不到您有什么问题。应该可以。
但是,如果要避免过程代码,可以使用CASE
表达式,如果存在'ROLE_PROJECT_MANAGER'
,则返回'manager'
,否则返回'manager'
。
例如在INSERT ... SELECT ...
中(但如果愿意,也可以将其放在VALUES
子句中):
INSERT INTO ccpt_data.user_role_permission
(user_role_name,
permission_name)
SELECT CASE
WHEN EXISTS (SELECT *
FROM ccpt_data.user_role_permission
WHERE user_role_name = 'manager') THEN
'ROLE_PROJECT_MANAGER'
ELSE
'manager'
END,
'MANAGE_SENSITIVE_DATA';
答案 1 :(得分:0)
您所说的是upsert
函数,可以通过PostgreSQL中的CTE(with子句)实现。
select * from test;
id | result
----+--------
1 | data1
(1 row)
with upsert as (
update test set result='data10' where id=3 returning *
)
insert into test select 3,'data10' where not exists (select 1 from upsert where id = 3);
INSERT 0 1
select * from test;
id | result
----+--------
1 | data1
3 | data10
(2 rows)
with upsert as (
update test set result='data22' where id=3 returning *
)
insert into test select 3,'data22' where not exists (select 1 from upsert where id = 3);
INSERT 0 0
select * from test;
id | result
----+--------
1 | data1
3 | data22