创建一个函数,用postgresql中的新值更新指定列中的第一个空值

anauzrmj  于 2023-01-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(136)

我有一个名为“Details”的表,其中有4列。
| 姓名|年龄|职业|出生年份|
| - ------|- ------|- ------|- ------|
| 扎夫|二十五|零|一九九七年|
| 大卫|零|零|二○ ○ ○年|
要求是,如果我在occupation列中插入一个值,我希望它插入到第一个空行上。这意味着,我希望首先填充该列的空行。例如,

insert into details(occupation)
values('student');

我想创建一个函数,如果我插入任何新值,它将返回这样的结果
| 姓名|年龄|职业|出生年份|
| - ------|- ------|- ------|- ------|
| 扎夫|二十五|学生| 一九九七年|
| 大卫|零|零|二○ ○ ○年|
我的问题是,如何在单个查询中更新列的值,如果该值为空,然后用新值更新。
我带来了这两个功能。

CREATE OR REPLACE FUNCTION update_null_value(value int)
RETURNS VOID AS $$
BEGIN
    UPDATE details
    SET occupation = value
    WHERE occupation IS NULL
    RETURNING occupation
    INTO value;

    SELECT value
    FROM details
    WHERE occupation= value
    LIMIT 1;
END;
$$ LANGUAGE plpgsql;

每当我传递一个值,我得到这个错误。错误:查询返回了多行提示:确保查询返回单行,或使用LIMIT 1。CONTEXT:PL/pgSQL函数update_null_value(整数)第3行,位于SQL语句SQL状态:第0003页
如果我在更新中限制为1,就像这个函数。我得到错误:在“limit”或其附近出现语法错误,因为我们无法在更新中使用limit 1。

CREATE OR REPLACE FUNCTION update_null_value(value int)
RETURNS VOID AS $$
BEGIN
    INSERT INTO organization_map (organization_id)
    VALUES (value);

    UPDATE organization_map
    SET organization_id = value
    WHERE organization_id IS NULL
    limit 1
    RETURNING organization_id
    INTO value;

    SELECT value
    FROM organization_map
    WHERE organization_id = value
    order by organization_id
    LIMIT 1;
END;
$$ LANGUAGE plpgsql;

如何创建一个适用于所有列和行的函数。请帮助。

vvppvyoh

vvppvyoh1#

此功能应该工作...

CREATE OR REPLACE FUNCTION update_null_value(value int)
RETURNS text LANGUAGE sql AS $$
    UPDATE details
    SET occupation = value
    WHERE occupation IS NULL
    RETURNING occupation :: text ; 
$$ ;

但是它将返回已知的输入参数value,并且它将更新occupation IS NULL
正如@Frank和@Stefanov所说:你如何识别“第一”行和唯一要更新的行?2你需要一个附加条件或排序来选择一行。

相关问题