我有一个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列,它可以完成工作,但看起来并不清晰或专业。
我想缩小此代码,使其看起来像专业代码。
非常感谢任何建议。
谢谢!
答案 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)