我试图更新表格,并且我想根据股票价值来判断2个不同的SET情景。
执行一个senario的工作代码。
UPDATE dbo.ar
SET webPublish = '0',
ArtProdKlass = '9999',
VaruGruppKod = '9999',
ItemStatusCode = '9' --Utgått ur sortimentet+
FROM tmp_9999
WHERE ar.ArtNr = tmp_9999.art AND ar.lagsadloartikel < '1'
我想做的是,如果最后一个声明(ar.lagsaldoartikel)是&gt;&#39; 1&#39;
那么我希望它能运行这个SET:
SET webPublish = '1',
ArtProdKlass = '1',
VaruGruppKod = '9999',
ItemStatusCode = '8'
所以我测试了这样的事情:
IF AR.lagsaldoartikel < '1'
SET webPublish = '0',
ArtProdKlass = '9999',
VaruGruppKod = '9999',
ItemStatusCode = '9' --Utgått ur sortimentet+
FROM tmp_9999
WHERE ar.ArtNr = tmp_9999.art --Väljer ut artiklar som enbart finns i textfilen och har lagersaldo mindre än 1
ELSE
SET webPublish = '1',
ArtProdKlass = '1',
VaruGruppKod = '9999',
ItemStatusCode = '8' --Utgått ur sortimentet
FROM tmp_9999
WHERE ar.ArtNr = tmp_9999.art --Väljer ut artiklar som enbart finns i textfilen och har lagersaldo mindre än 1
答案 0 :(得分:1)
使用CASE
:
UPDATE dbo.ar
SET webPublish = '0',
ArtProdKlass = '9999',
VaruGruppKod = '9999',
ItemStatusCode = CASE WHEN AR.lagsaldoartikel < '1' THEN '9' ELSE '8' END
FROM tmp_9999
WHERE ar.ArtNr = tmp_9999.art
(如果ItemStatusCode
等为数字,则应将其视为数字。)
答案 1 :(得分:1)
If
是程序性T-SQL的一部分。您不能在关系中使用过程语句 - 使用if
的唯一方法是使用两个单独的update
语句,每个语句都在if
的一个分支中。但是,这是一个坏主意 - 它不是并发安全的。
实现你要做的事情的一种方法是使用case
语句 - 这只是一个表达式,所以它可以在set
子句中使用就好了:
set webPublish = case when AR.lagsaldoartikel < '1' then '0' else '1' end
(等其他参数)。
但是,我想警告你 - 这几乎肯定是一个坏主意。当你意识到你可能想要的十种不同的条件和一百种不同的可能值时,它很可能会在未来很快回击你。考虑使用一种更具惯用性的关系方式来做这件事 - 例如,从不同的表中获取条件和参数 - 现在不需要,但是如果你发现你的条件正在扩展到合理的大小,请记住考虑改变整个结构如果需要,命令。