我有一个包含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 怎么样?我做了一些谷歌搜索,但找不到任何真正相关的东西。
您可以使用 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)