在PostgreSQL 9.1中,PL / pgSQL给出了一个查询:
select fk_list.relname from ...
其中relname
的类型name
(例如“ table_name”)。
如何获得“ relname”的适当值,该值可直接在UPDATE
语句中用作:
Update <relname> set ...
在PL / pgSQL脚本中?
使用quote_ident(r.relname)
如:
Update quote_ident(r.relname) Set ...
失败与:
“(”或附近的语法错误LINE 55:UPDATE quote_ident(r.relname)…。
我正在使用的完整代码:
CREATE FUNCTION merge_children_of_icd9 (ocicd9 text,
ocdesc text, ncicd9 text, ncdesc text)
RETURNS void AS $BODY$
DECLARE
r RECORD;
BEGIN
FOR r IN
WITH fk_actions ( code, action ) AS (
VALUES ('a', 'error'),
('r', 'restrict'),
('c', 'cascade'),
('n', 'set null'),
('d', 'set default')
), fk_list AS (
SELECT pg_constraint.oid AS fkoid, conrelid, confrelid::regclass AS parentid,
conname, relname, nspname,
fk_actions_update.action AS update_action,
fk_actions_delete.action AS delete_action,
conkey AS key_cols
FROM pg_constraint
JOIN pg_class ON conrelid = pg_class.oid
JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
JOIN fk_actions AS fk_actions_update ON confupdtype = fk_actions_update.code
JOIN fk_actions AS fk_actions_delete ON confdeltype = fk_actions_delete.code
WHERE contype = 'f'
), fk_attributes AS (
SELECT fkoid, conrelid, attname, attnum
FROM fk_list
JOIN pg_attribute ON conrelid = attrelid AND attnum = ANY(key_cols)
ORDER BY fkoid, attnum
), fk_cols_list AS (
SELECT fkoid, array_agg(attname) AS cols_list
FROM fk_attributes
GROUP BY fkoid
)
SELECT fk_list.fkoid, fk_list.conrelid, fk_list.parentid, fk_list.conname,
fk_list.relname, fk_cols_list.cols_list
FROM fk_list
JOIN fk_cols_list USING (fkoid)
WHERE parentid = 'icd9'::regclass
LOOP
RAISE NOTICE 'now in loop. relname is %', quote_ident(r.relname);
RAISE NOTICE 'cols_list[1] is %', quote_ident(r.cols_list[1]);
RAISE NOTICE 'cols_list[2] is %', quote_ident(r.cols_list[2]);
RAISE NOTICE 'now doing update';
UPDATE quote_ident(r.relname) SET r.cols_list[1] = ncicd9, r.cols_list[2] = ncdesc
WHERE r.cols_list[1] = ocicd9 AND r.cols_list[2] = ocdesc;
RAISE NOTICE 'finished update';
END LOOP;
RETURN;
END $BODY$ LANGUAGE plpgsql VOLATILE;
-- select merge_children_of_icd9('', 'aodm type 2', '', 'aodm, type 2');
我敢肯定这种事情经常发生,但是我似乎无法使用PostgreSQL找到类似的东西。有没有更好的办法?
在UPDATE
PL /
pgSQL的语句中,表名必须以文字形式给出。如果要动态设置表名和列,则应使用以下EXECUTE
命令并将查询字符串粘贴到一起:
EXECUTE 'UPDATE ' || quote_ident(r.relname) ||
' SET ' || quote_ident(r.cols_list[1]) || ' = $1, ' ||
quote_ident(r.cols_list[2]) || ' = $2' ||
' WHERE ' || quote_ident(r.cols_list[1]) || ' = $3 AND ' ||
quote_ident(r.cols_list[2]) || ' = $4'
USING ncicd9, ncdesc, ocicd9, ocdesc;
该USING
子句只能用于替代数据值,如上所述。
问题内容: 我有3张桌子。团队,选项,选项团队。 团队拥有一个TeamId,名称 拥有Option拥有OptionId,OptionGroup OptionTeam拥有TeamId,OptionId,OptionGroup 我想获得一个团队列表,以及额外的列,这些列指示每个组有多少个选项连接到每个团队。这是通过上面的查询完成的,但是我想用表Option中的OptionGroup值替换4,5,6,1
问题内容: 有我的问题,我有一个像这样的表: 当我创建表时,默认情况下排名为0,而我想要的是使用以下选择来更新表中的排名: 这个Select工作正常,但是我找不到使用它来更新table1的方法 我没有找到任何答案可以解决这种问题。如果有人可以给我任何有关是否可行的建议,我将不胜感激。 谢谢! 问题答案: 您可以加入 子查询 并执行 UPDATE : 在谓词中添加所需条件。 或者, 您可以使用 ME
我试图提供一个实用程序,在该实用程序中,我可以获得表中每列的最大数据长度。 > 我在列表中有列的列表。 我查看每个列表。 执行下面准备好的语句。 带有max函数的prepared语句似乎不能使用动态列。它给出的值不正确。 准备好的语句是否可以与select子句中的动态列一起工作。
问题内容: 为什么我得到#1222-使用的SELECT语句具有不同数量的列?我正在尝试从此用户朋友和他自己处加载墙贴。 wall_posts表结构如下所示 Friends表结构如下所示 pid代表配置文件ID。我不太确定发生了什么。 问题答案: UNION中的第一条语句返回四列: 第二个返回 六 ,因为*扩展为包括以下所有列: 在与运营商要求: 组成UNION查询的所有语句中存在相同数量的列 数据
问题内容: 在WHERE子句中有使用SELECT语句描述的名称吗?这是好/不好的做法吗? 这会是更好的选择吗? 它远没有那么优雅,但是运行起来比以前的版本要快。我不喜欢它,因为它在GUI中没有非常清晰地显示(并且SQL初学者需要理解它)。我可以将其分为两个独立的查询,但是随后事情变得混乱了…… 注意:我不仅需要日期和分数(例如姓名) 问题答案: 称为相关子查询。它有它的用途。