例如,我有一个存储过程来从 csv 文件导入数据并将读取的数据写入 SQL 表。我有一个定义如下的表:
CREATE TABLE person (id int, name text, age int, married boolean);
首先我检查记录是否已经存在,如果存在我更新,如果不存在 - 插入。每个记录字段可能有不同的类型,因此 SQL 命令的结果被分配给一个标量变量列表:
SELECT name, age, married INTO v_name, v_age, v_married [..]
假设每一列都被声明为可选(允许为 NULL)。那么检查哪个变量(v_name,v_age,v_married)不是NULL并且可以处理的最好方法是什么?
我找到了很多解决方案:
- 如果没有找到
- 当 NO_DATA_FOUND 那么
- 如果 v_age 不为空,那么 [...]
当我必须检查多个列(col)时,我现在正在使用我上面提到的最后一种方式或动态解决方案:
list_of_columns := ARRAY['name','age','married'];
FOREACH x IN ARRAY list_of_columns LOOP
EXECUTE 'SELECT ' || x
|| ' FROM person
WHERE id = ' || quote_literal(v_id)
INTO y;
IF x = 'name' AND (y != v_name OR y IS NULL) THEN
UPDATE person
SET name = v_name
WHERE id = v_id;
ELSIF x = 'age' AND (y != v_age OR y IS NULL) THEN
UPDATE person
SET age = v_age
WHERE id = v_id;
ELSIF x = 'married' AND (y != v_married OR y IS NULL) THEN
UPDATE person
SET married= v_married
WHERE id = v_id;
END IF;
END LOOP;
我正在寻找考虑到最佳实践和性能的最佳解决方案。任何帮助表示赞赏!