PostgreSQL存储过程传入单元素数组如何仅更新密码不修改用户名
实现方案
你可以通过array_length()函数判断传入数组的长度,在UPDATE语句里用CASE分支做赋值逻辑,既兼容原有双元素传参的使用方式,也能满足单元素仅更新密码的需求。
修改后的完整存储过程如下:
CREATE OR REPLACE PROCEDURE blkupd(_newitem TEXT ARRAY, _id INT) LANGUAGE SQL AS $$ UPDATE users SET -- 数组长度>=2时才更新用户名,否则保留原值 user_name = CASE WHEN array_length(_newitem, 1) >= 2 THEN _newitem[1] ELSE user_name END, -- 数组长度为1时取第一个元素更新密码,长度>=2时取第二个元素更新密码 user_password = CASE WHEN array_length(_newitem, 1) = 1 THEN _newitem[1] ELSE _newitem[2] END WHERE user_id = _id $$;
效果验证
- 单元素传参调用:
CALL blkupd('{df}', 4);
仅将user_id为4的用户密码更新为df,用户名保持原有值不变 - 双元素传参调用:
CALL blkupd('{bc, df}', 4);
和原有逻辑完全一致,用户名更新为bc、密码更新为df
如果需要增加鲁棒性,可以在存储过程开头增加数组长度校验,避免传入空数组导致的赋值异常。
内容的提问来源于stack exchange,提问作者salif shaikh
相关产品推荐
相关产品推荐

