2013-02-15 93 views
2

我现有的SQL语句中使用IIF在SQL更新语句

UPDATE EMP 
    SET fte_adj = IIf((fte<1 Or fte Is Null) And [employment category] Like '*Full-Time*',1, 
IIf((fte=0 Or fte Is Null) And [employment category] Like '*Part-Time*',0.25,fte)); 

它会在存在EMPLOYEE_ID更新表EMP

set fte_adj=1 
if Full time (and fte<1 or null) 

set fte_adj=0.25 
if part time (and fte=0 or null) 

otherwise fte_adj=fte 

我如何添加的情况下,以检查是否有任何记录另一张表SEC_EMP

如果没有记录(0行),然后set fte_adj=1

两个表可以使用EMPLOYEE_ID作为关键

感谢

+1

您是否想过使用Case语句? – 2013-02-15 15:42:53

+0

你想添加额外约束的地方? – sgeddes 2013-02-15 15:50:39

+0

抱歉,我的问题缺失。我需要检查另一个表“SEC_EMP”中是否存在employee_id的行。是不是真的,我在EMP.employee_id = SEC_EMP.employee_id的末尾添加了WHERE子句? – 2013-02-15 16:46:56

回答

2

我已经重写使用情况下,你的语句(但我知道IIF于2012年的作品):

UPDATE EMP 
SET fte_adj = 
    CASE WHEN (FTE < 1 OR FTE IS NULL) AND [employment category] Like '*Full-Time*' 
    THEN 1 
    ELSE 
    CASE WHEN (FTE = 0 OR FTE IS NULL) AND [employment category] Like '*Part-Time*' 
     THEN 0.25 
    ELSE 
     CASE WHEN (SELECT COUNT(*) FROM SEC_EMP) = 0 
     THEN 1 
     ELSE 
     FTE 
     END 
    END 
    END 

这里是一些样本Fiddle

如果你喜欢IIF逻辑,在这里你去:

UPDATE EMP 
SET fte_adj = 
    IIF ((FTE < 1 OR FTE IS NULL) AND [employment category] Like '*Full-Time*' , 1 , 
     IIF ((FTE = 0 OR FTE IS NULL) AND [employment category] Like '*Part-Time*' , 0.25, 
      IIF ((SELECT COUNT(*) FROM SEC_EMP) = 0 , 1 , FTE) 
     ) 
     ) 

而且更Fiddle

- 编辑 -

如果我理解最新的评论,您要更新,在SEC_EMP表只存在记录?如果是这样,只需加入表格即可:

UPDATE E 
SET fte_adj = 
    IIF ((FTE < 1 OR FTE IS NULL) AND [employment category] Like '*Full-Time*' , 1 , 
     IIF ((FTE = 0 OR FTE IS NULL) AND [employment category] Like '*Part-Time*' , 0.25, FTE 
     ) 
     ) 
FROM EMP E 
    JOIN SEC_EMP SE ON E.employee_id = SE.employee_id 

和更多Fiddle

+0

对不起,我的问题是缺少的。我需要检查另一个表“SEC_EMP”中是否存在employee_id的行。是不是真的,我在EMP.employee_id = SEC_EMP.employee_id的末尾添加了WHERE子句? – 2013-02-15 16:46:30

+0

@JoeYan - 所以你只想更新SEC_Emp中存在的记录 - 如果是这种情况就够简单了 - 告诉我,我将使用JOIN更新答案。 – sgeddes 2013-02-15 16:48:17

+0

@JoeYan - 我更新了我的答案 - 只会更新在SEC_EMP表中匹配的用户。希望这有助于(并且我正确理解您的要求)。 – sgeddes 2013-02-15 16:53:44

0

您可以添加一个IIF,永远是相关的,其中,有EXISTS声明:

IIF(NOT EXISTS(
    SELECT [some column] FROM [some table] 
    WHERE [some condition] 
), 1, [some value OR another IIF statement]) 
1

试试这个:

UPDATE EMP 
SET fte_adj = CASE WHEN fte=1 Or fte Is Not Null And [employment category] Like '%Full-Time%' 
THEN 1 ELSE .25 END AS 'Rate' 

我还取决于你的表添加

WHERE [employment category] Like '%Full-Time%' OR [employment category] Like '%Part-Time%' 

为了安全。这是MS SQL的顺便说一句,不知道'* syntax *'来自哪里。

+0

他目前的sql查询很可能是ms-access – Lamak 2013-02-15 15:53:24

+1

@Lamak - 我猜SQL Server 2012 – sgeddes 2013-02-15 15:55:14

+0

@sgeddes这也是一个选项 – Lamak 2013-02-15 15:57:32

0

来自sgeddes的case语句的简化版本。

UPDATE EMP 
SET fte_adj = 
    CASE WHEN (FTE < 1 OR FTE IS NULL) AND [employment category] Like '*Full-Time*' 
     THEN 1 
    WHEN (FTE = 0 OR FTE IS NULL) AND [employment category] Like '*Part-Time*' 
     THEN 0.25 
    WHEN (SELECT COUNT(*) FROM SEC_EMP) = 0 
     THEN 1 
    ELSE 
     FTE 
    END 

与IF不同的情况下,可以有多个分支。他们也短路,所以得到的第一个分支就是它。因此,例如

CASE WHEN 1=1 
WHEN 2=2 
END 

永远不会超过1 = 1分支。

+2

我会小心“不要” - 有时会评估后续分支,这可能会影响性能,原因错误,如果你真的相信短路会出现意外。尽管SQL Server文档可能会使您相信'CASE'在这里完美无缺,请参阅:http://dba.stackexchange.com/questions/12941/does-sql-server-read-all-of-a-coalesce-函数 - 即使是第一个参数是/否/ 12945#12945 – 2013-02-15 16:06:21

+0

我不知道我在想什么 - 从字面上理解IIF :)对CASE的更好的解释! – sgeddes 2013-02-15 16:06:42

+0

优秀点亚伦。我必须记住这一点,并将我的声明更改为Will通常永远不会超过1 = 1分支:) – 2013-02-15 16:11:06