2

私の既存の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));

テーブルを更新します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

ケースを追加して、employee_idのレコードが別のテーブルに存在するかどうかを確認するにはどうすればよいSEC_EMPですか?

レコードがない場合(0行)、set fte_adj=1

両方のテーブルでemployee_idをキーとして使用できます

ありがとう

4

4 に答える 4

2

CASEを使用してステートメントを書き直しました(ただし、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

そして、ここにいくつかのサンプルフィドルがあります。

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 ) 
          )
       )

そしてもっとフィドル

- 編集 -

最新のコメントを理解している場合は、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 

そしてもっとフィドル

于 2013-02-15T15:54:42.690 に答える
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%'

あなたのテーブルに応じて安全のために。これはMSSQLの場合であり、「*構文*」が何であるかはわかりません。

于 2013-02-15T15:50:34.977 に答える
0

IIF必要に応じて、次のEXISTSステートメントを追加できます。

IIF(NOT EXISTS(
    SELECT [some column] FROM [some table]
    WHERE [some condition]
), 1, [some value OR another IIF statement])
于 2013-02-15T15:43:37.210 に答える
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ブランチを通過することはありません。

于 2013-02-15T16:01:16.103 に答える