我的数据库中有许多文本列,其中值是空字符串(''
)。空字符串需要设置为NULL
。我不知道此数据库中的确切架构,表和列,或者我想写一个可以重用的通用解决方案。
我将如何编写查询/函数以在所有架构的所有表中查找所有文本列,并使用空字符串(''
)将所有列更新为NULL
?
实现此目的的最有效方法:
UPDATE
每个表运行一个。NOT NULL
使用任何实际的空字符串更新可为空的列(未定义)。这个相关的答案具有plpgsql函数,该函数针对任何给定的表UPDATE
使用系统目录pg_attribute
自动安全地构建和运行命令
使用f_empty2null()
此答案中的函数,您可以像这样遍历选定的表:
DO
$do$
DECLARE
_tbl regclass;
BEGIN
FOR _tbl IN
SELECT c.oid::regclass
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r' -- only regular tables
AND n.nspname NOT LIKE 'pg_%' -- exclude system schemas
LOOP
RAISE NOTICE $$PERFORM f_empty2null('%');$$, _tbl;
-- PERFORM f_empty2null(_tbl); -- uncomment to prime the bomb
END LOOP;
END
$do$;
小心! 这将更新数据库中所有用户表的所有列中的所有空字符串。确保这是您想要的,否则可能会破坏数据库。
UPDATE
当然,您需要对所有选定表具有特权。
作为儿童安全装置,我评论了有效载荷。
这是重复使用的集成解决方案。没有安全装置:
CREATE OR REPLACE FUNCTION f_all_empty2null(OUT _tables int, OUT _rows int) AS
$func$
DECLARE
_typ CONSTANT regtype[] := '{text, bpchar, varchar, \"char\"}';
_sql text;
_row_ct int;
BEGIN
_tables := 0; _rows := 0;
FOR _sql IN
SELECT format('UPDATE %s SET %s WHERE %s'
, t.tbl
, string_agg(format($$%1$s = NULLIF(%1$s, '')$$, t.col), ', ')
, string_agg(t.col || $$ = ''$$, ' OR '))
FROM (
SELECT c.oid::regclass AS tbl, quote_ident(attname) AS col
FROM pg_namespace n
JOIN pg_class c ON c.relnamespace = n.oid
JOIN pg_attribute a ON a.attrelid = c.oid
WHERE n.nspname NOT LIKE 'pg_%' -- exclude system schemas
AND c.relkind = 'r' -- only regular tables
AND a.attnum >= 1 -- exclude tableoid & friends
AND NOT a.attisdropped -- exclude dropped columns
AND NOT a.attnotnull -- exclude columns defined NOT NULL!
AND a.atttypid = ANY(_typ) -- only character types
ORDER BY a.attnum
) t
GROUP BY t.tbl
LOOP
EXECUTE _sql;
GET DIAGNOSTICS _row_ct = ROW_COUNT; -- report nr. of affected rows
_tables := _tables + 1;
_rows := _rows + _row_ct;
END LOOP;
END
$func$ LANGUAGE plpgsql;
称呼:
SELECT * FROM pg_temp.f_all_empty2null();
返回值:
_tables | _rows
---------+---------
23 | 123456
请注意 我如何正确地转义了表名和列名!
c.oid::regclass AS tbl, quote_ident(attname) AS col
问题内容: 如何将类型中的字符串指针的引用值设置为空字符串?考虑以下示例: 我尝试了和运算符的所有组合都无济于事: 显然其中一些很愚蠢,但我没有发现尝试的危害。我也尝试使用和: 这会导致编译错误 恐慌:反映:使用不可寻址的值reflect.Value.SetString 我假设这是因为Go中的字符串是不可变的? 问题答案: 字符串文字不可寻址。 取包含空字符串的变量的地址: 或使用新的:
问题内容: 有什么方法可以将null转换为Integer。null实际上是一个字符串,我在我的服务层中传递该字符串,将其接受为整数。因此,每当我尝试将null字符串强制转换为Integer时,都会引发异常。但是我必须将null转换为Integer。 问题答案: 您 不能 从String强制转换为Integer。但是,如果您尝试将字符串转换为整数,并且必须提供处理字符串的实现,请查看以下代码片段:
问题内容: 我有一个特定的字符串,例如“ 123abcd”,但我不知道表的名称,甚至不知道SQL Server数据库中表内的列的名称。我想通过选择找到它并显示相关字符串的所有列,所以我想知道以下内容: 出于显而易见的原因,它不起作用,但是有一种简单的方法可以创建一个select语句来执行类似的操作? 问题答案: 这将起作用: 不过,有几点警告。首先, 这是极其缓慢且未优化的 。所有值都将被简单地转
如何将字符串值转换为整数,并将转换后的值乘以整数,这样我就可以得到300.00的结果。见下面的例子- 如果我像这样编码,那么我就会出错-
问题内容: 我正在尝试在整个Oracle数据库中查找特定的字符串。 我已经在此处的另一个主题(在所有表中的所有字段中搜索特定值(Oracle))中遵循了该示例,并且当字符串是一列中的整个值时,它就可以正常工作。但是我需要搜索字符串作为列的一部分。 例如,如果我搜索“ Alert”,则应返回所有带有“ Alert”的列和所有带有“ Alert_QB”的列 这是当前的查询: 我认为它靠近“使用’ALE
我正在寻找一个内置的UDF来转换字符串列的值为整数在我的配置单元表排序使用选择和排序。我在语言手册上查了一下,但没有用。任何其他建议也欢迎。