将所有列(在表格中)中的所有零(如果有)更改为...说1

时间:2012-03-21 23:11:39

标签: sql postgresql

我有一个包含18列(所有Ints)和1040行的表。如果任何值为零我想将其更改为1.我正在使用Postgresql。做这个的最好方式是什么。我无法想出一个简单的更新声明......我是DB的新手。

关于我应该学习如何实现这样的事情的任何指示...(我会想某种脚本,如果postgresql存在这样的东西......我不知道)

由于

2 个答案:

答案 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

在执行之前评论USINGRAISE NOTICE行并取消注释{{1}}和结束的parens以检查生成的代码。