如何检查表中的列是否具有特定值?

时间:2019-05-16 11:18:57

标签: postgresql

我需要有关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$

2 个答案:

答案 0 :(得分:0)

除了缺少SELECTFROM之间的内容以及您需要在引号中加上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
相关问题