我有一个包含18列(所有Ints)和1040行的表。如果任何值为零我想将其更改为1.我正在使用Postgresql。做这个的最好方式是什么。我无法想出一个简单的更新声明......我是DB的新手。
关于我应该学习如何实现这样的事情的任何指示...(我会想某种脚本,如果postgresql存在这样的东西......我不知道)
由于
答案 0 :(得分:2)
这个怎么样
UPDATE table SET columnA = 1 WHERE columnA = 0
但是您需要查询每个列,或
UPDATE table SET columnA =
CASE WHEN columnA = 0 THEN 1
ELSE columnA
END,
columnB =
CASE WHEN columnB = 0 THEN 1
ELSE columnB
END, ...
答案 1 :(得分:2)
我为了类似的目的改编了一个plpgsql函数:
CREATE OR REPLACE FUNCTION f_update_all_cols(_sch text, _tbl text, _old int, _new int)
RETURNS text AS
$func$
DECLARE
_type CONSTANT regtype[] := '{bigint,smallint,integer}';
_toid regclass; -- table oid
_msg text := ''; -- report
_ct integer; -- count of rows for report
BEGIN
-- Loop over tables
FOR _toid IN
SELECT c.oid
FROM pg_class c
JOIN pg_namespace nc ON nc.oid = c.relnamespace
WHERE c.relkind = 'r'
AND nc.nspname = _sch
AND c.relname LIKE (_tbl || '%')
ORDER BY c.relname
LOOP
EXECUTE (
-- RAISE NOTICE '%', (
SELECT format('UPDATE %s SET (%s) = (%s) WHERE $1 IN (%2$s)'
, _toid
, string_agg(quote_ident(attname), ', ' ORDER BY a.attnum)
, string_agg(format('CASE WHEN %1$I = $1 THEN $2 ELSE %1$I END', attname), ', ')
)
FROM pg_attribute a
WHERE a.attrelid = _toid
AND a.attnum >= 1 -- exclude neg. attnum - tableoid etc.
AND NOT a.attisdropped -- exclude deleted columns
AND a.atttypid = ANY(_type)
GROUP BY _toid)
USING _old, _new;
-- );
GET DIAGNOSTICS _ct = ROW_COUNT;
_msg := _msg || _ct || ' row(s) in: ' || _toid || E'\n';
END LOOP;
RETURN _msg;
END
$func$ LANGUAGE plpgsql;
COMMENT ON FUNCTION f_update_all_cols(text, text, int, int) IS $$
Convert 0 to 1 in all integer type columns.
$1 .. _sch: schema
$2 .. _tbl: table-pattern: left anchored search pattern; default "%"
$3 .. _old: replace this ...
$4 .. _new: ... with this) -- $$;
呼叫:
SELECT f_update_all_cols('myschema', '', 0, 1); -- all tables in schema
SELECT f_update_all_cols('myschema', 'foo', 0, 1); -- tables starting with foo
查看所有integer
类型列,并将给定的_old
值更改为给定值
_new
值。_type
如果要包含其他数据类型,请相应地编辑变量EXECUTE
。
在执行之前评论USING
和RAISE NOTICE
行并取消注释{{1}}和结束的parens以检查生成的代码。