如何压缩多个更新语句 - SQL

时间:2016-10-12 12:38:54

标签: sql sql-server tsql

我有一个10列的更新语句,它将每个列中的值替换为该特定列的where条件。

以下是代码:

UPDATE Table1
SET Col1 = REPLACE(Col1, '#DIV/0', NULL)
WHERE Col1 = '#DIV/0';


UPDATE Table1
SET Col2 = REPLACE(Col2, '#DIV/0', NULL)
WHERE Col2 = '#DIV/0';


UPDATE Table1
SET Col3 = REPLACE(Col3, '#DIV/0', NULL)
WHERE Col3 = '#DIV/0';

像这样我有10列,它可以完成工作,但看起来并不清晰或专业。

我想缩小此代码,使其看起来像专业代码。

非常感谢任何建议。

谢谢!

3 个答案:

答案 0 :(得分:5)

如果case表达式不等于'#DIV/0',则使用else null表达式保留旧值,默认'#DIV/0'将使用NULL替换UPDATE Table1 SET Col1 = case when Col1 <> '#DIV/0' then Col1 end, Col2 = case when Col2 <> '#DIV/0' then Col2 end, ... 值。

where '#DIV/0' in (Col1, Col2, ...)

请注意,所有行都将更新,即一个巨大的事务。如果这是一个问题,请返回原始解决方案并进行多次更新,或者在最后添加:

searchd
{
  dist_threads = 2
  listen            = 9312
  log               = /var/log/sphinxsearch/searchd.log
  query_log         = /var/log/sphinxsearch/query.log
  read_timeout      = 5
  max_children      = 30
  pid_file          = /var/run/sphinxsearch/searchd.pid
  max_matches       = 1000000
  seamless_rotate   = 1
  preopen_indexes   = 1
  unlink_old        = 1
  binlog_path       = /var/lib/sphinxsearch/data
}

如果这是一个好的或坏的想法取决于数据,需要更新多少百分比的行/列。索引等。

答案 1 :(得分:5)

我建议您保留原样,只需更改一次,因为REPLACE(Col1, '#DIV/0', NULL)之类的语句没有意义:在sql server中调用任何参数为NULL的REPLACE总是产生NULL,无论是否找到文本或不

最好的是:

UPDATE Table1 SET Col1 = NULL WHERE Col1 = '#DIV/0';
UPDATE Table1 SET Col2 = NULL WHERE Col2 = '#DIV/0';
UPDATE Table1 SET Col3 = NULL WHERE Col3 = '#DIV/0';

答案 2 :(得分:0)

假设它的T-SQL,为什么不使用NULLIF函数

DECLARE ValToNull AS VARCHAR(10) = '#DIV/0'

UPDATE Table1
SET Col1 = NULLIF(Col1, ValToNull),
Col2 = NULLIF(Col2, ValToNull),
Col3 = NULLIF(Col3, ValToNull)