更新表格的每个单元格?

Jam*_*own 2 postgresql

我有一个包含m列和n行的表格。我使用的 ETL 工具''向每个没有值的单元格写入了一个空的 ( ),我希望它们可以NULL代替。这让我思考是否有可能在单个语句中对UPDATE每个带有 , 值的单元格进行''处理NULL
在我的表中,每一列恰好是VARCHAR(或CHARACTER VARYING)。

    Col1|Col2|...|Coln          Col1|Col2|...|Coln
Row1   a   ''  ''    1      Row1   a NULL NULL   1
Row2   c   ''   e   ''      Row2   c NULL   e NULL
...                     -->  ...
Rown  aa    f  ''  123      Rown  aa    f NULL 123
Run Code Online (Sandbox Code Playgroud)

可以用 SQL 吗?PL/pgSQL 怎么样?我做了一些谷歌搜索,但找不到任何真正相关的东西。

ype*_*eᵀᴹ 6

您可以使用 n 个UPDATE语句,每列一个:

UPDATE table SET Col1 = NULL WHERE Col1 = '';
UPDATE table SET Col2 = NULL WHERE Col2 = '';
---
UPDATE table SET ColN = NULL WHERE ColN = '';
Run Code Online (Sandbox Code Playgroud)

或一个CASE

UPDATE table 
SET Col1 = CASE WHEN Col1 = '' THEN NULL ELSE Col1 END,
    Col2 = CASE WHEN Col2 = '' THEN NULL ELSE Col2 END,
    ---
    ColN = CASE WHEN ColN = '' THEN NULL ELSE ColN END 
WHERE                                           
    Col1 = '' OR Col2 = '' OR ... OR ColN = '' ;      --- optional WHERE clause  
Run Code Online (Sandbox Code Playgroud)

WHERE条款是不需要的。但是,如果您稍后再次运行它,当几乎没有空行时,这将有助于保持事务“更小”,只更新那些行而不是整个表。

另一个等效的,只是更短的语法,使用该NULLIF()函数:

UPDATE table 
SET Col1 = NULLIF(Col1, ''),
    Col2 = NULLIF(Col2, ''),
    ---
    ColN = NULLIF(ColN, '')
WHERE                                           
    Col1 = '' OR Col2 = '' OR ... OR ColN = '' ;      --- optional WHERE clause  
Run Code Online (Sandbox Code Playgroud)