PostgreSQL -基于其他值更新列值

5kgi1eie  于 2023-01-30  发布在  PostgreSQL
关注(0)|答案(2)|浏览(169)

我一直在尝试实现基于列值的表的自动更新。下面是一个示例。其思想是用户将输入他们的电话号码,而不是他们的国家,如下所示:
| 手机|乡村|
| - ------|- ------|
| "51682815"||
| "51261728"||
| "56682815"||
| '56261728'||
| "57682815"||
| '五七二六一七二八'||
根据"* mobile_phone *"信息,我想使用以下逻辑自动分配他们的国家/地区:

  • WHERE左侧(移动电话,2)="51",然后执行"PE"
  • WHERE左侧(移动电话,2)="56",然后选择"CL"
  • 左移(移动电话,2)="57",然后按"CO"

根据该逻辑,表格应使用以下信息自动更新:
| 手机|乡村|
| - ------|- ------|
| "51682815"|"PE"|
| "51261728"|"PE"|
| "56682815"|"CL"|
| '56261728'|"CL"|
| "57682815"|"文书主任"|
| '五七二六一七二八'|"文书主任"|
我想创建一个这样的触发器,但问题是我不知道如何创建更新列country的函数:

CREATE TRIGGER update_country AFTER INSERT ON info
FOR EACH ROW EXECUTE PROCEDURE function_name()

先谢谢你的帮助。

ygya80vv

ygya80vv1#

由于要更新的记录已在数据库中找到,因此应首先使用UPDATE语句更新当前行。可以使用CASE表达式来执行此操作,该表达式将根据“* 移动的_phone*"有条件地分配“country”值。

UPDATE "info"
SET country = CASE WHEN LEFT(mobile_phone,2) = '51' THEN 'PE'
                   WHEN LEFT(mobile_phone,2) = '56' THEN 'CL'
                   WHEN LEFT(mobile_phone,2) = '57' THEN 'CO' END;

然后创建相应的触发器,它将在插入之前更新您的记录。

  • 函数“update_country()",它返回一个触发器,该触发器使用NEW访问插入行中的值并更新其国家值
  • 触发器创建定义(您也包含在帖子中),它使用“update_country()”更新插入语句中的记录。
CREATE OR REPLACE FUNCTION update_country()
RETURNS TRIGGER AS
'
BEGIN
    NEW.country = CASE WHEN LEFT(NEW.mobile_phone,2) = ''51'' THEN ''PE''
                       WHEN LEFT(NEW.mobile_phone,2) = ''56'' THEN ''CL''
                       WHEN LEFT(NEW.mobile_phone,2) = ''57'' THEN ''CO'' END;
    RETURN NEW;
END;
'
LANGUAGE plpgsql;

CREATE TRIGGER update_country_trigger
BEFORE INSERT ON "info"
FOR EACH ROW
EXECUTE PROCEDURE update_country();

检查here演示。

owfi6suc

owfi6suc2#

您可以使用"生成的列"。使用"生成的列"不能执行以下操作
update info set country = 'x';
insert into info(country) value ('x');
https://www.postgresql.org/docs/current/ddl-generated-columns.html

BEGIN;
CREATE temp TABLE info (
    mobile_phone text
    , country text GENERATED ALWAYS AS ( CASE WHEN
    LEFT (mobile_phone , 2) = '51' THEN
        'PE'
    WHEN
    LEFT (mobile_phone , 2) = '52' THEN
        'XY'
    WHEN
    LEFT (mobile_phone , 2) = '53' THEN
        'AB'
    WHEN
    LEFT (mobile_phone , 2) = '54' THEN
        'CD'
    WHEN
    LEFT (mobile_phone , 2) = '55' THEN
        'EF'
    WHEN
    LEFT (mobile_phone , 2) = '56' THEN
        'CL'
    WHEN
    LEFT (mobile_phone , 2) = '57' THEN
        'CO'
    ELSE
        'NA'
    END) STORED
) ON COMMIT DROP;
INSERT INTO info (mobile_phone)
    VALUES ('51682815')
    , ('51261728')
    , ('56682815')
    , ('56261728')
    , ('57682815')
    , ('57261728');
TABLE info;
END;

相关问题