11
(case [dbo].[YearsInService]([DateEngaged],getdate())
   when (0) then (0) 
   when (1) then (4) 
   when (2) then (8)
    when (3) then (12)
     when (4) then (32) 
     when (5) then (40) 
     when (6) then (48) 
     when (7) then (56) 
     when (8) then (104) 
     when (9) then (117) 
     when (10) then (150) else (-1) end)

最後の行で、10 以上を 150 として返す必要があるとどのように言えますか?

4

6 に答える 6

14

できません。これCASE YourFunction WHEN ...は平等専用です。「より大きい」を使用する必要がある場合は、式を次のように書き直す必要があります。

CASE WHEN [dbo].[YearsInService]([DateEngaged],getdate()) = 0 THEN 0
WHEN [dbo].[YearsInService]([DateEngaged],getdate()) = 1 THEN 4
WHEN.....
WHEN [dbo].[YearsInService]([DateEngaged],getdate()) >= 10 THEN 150 ELSE -1 END
于 2013-04-08T13:41:28.160 に答える
8

Simple Case statement論理式が許可されていない場所を使用しています。を使用する必要がありますSearched CASE expression。ただし、関数を使用しているため、各式の関数から戻り値を取得するには少しコストがかかります。

Simple Case と Searched CASE Syntax の両方の MSDN リンクは次のとおりです。

次のように a を使用することをお勧めしますsub query with a Searched case

select case when results = 0 then 0
            when results = 1 then 4
            ...
            when results >= 10 then 150
            else -1 end as CaseResults
from (select [dbo].[YearsInService]([DateEngaged],getdate()) results
      from yourTable
     ) Temp
于 2013-04-08T13:40:54.763 に答える
1

DateEngaged(あなたのコメントから) が である場合NULL、それが でYearsInServiceあると仮定すると、現在の節をNULL削除してから、次のように使用します。ELSEall other cases

case COALESCE([dbo].[YearsInService]([DateEngaged],getdate()),-1)
when (-1) then (-1)
when (0) then (0) 
when (1) then (4) 
when (2) then (8)
when (3) then (12)
 when (4) then (32) 
 when (5) then (40) 
 when (6) then (48) 
 when (7) then (56) 
 when (8) then (104) 
 when (9) then (117) 
 else (150) end

将来の日付の値に懸念がある場合は、式で処理しようとするのではなく、DateEngaged内部で処理します。YearsInServiceCASE

于 2013-04-08T13:53:23.237 に答える
1

http://msdn.microsoft.com/en-us/library/ms181765.aspxから

SELECT 
  CASE 
     WHEN MIN(value) <= 0 THEN 0 
     WHEN MAX(1/value) >= 100 THEN 1 
  END 
FROM Data

WHEN 句では任意のブール式を使用できます

case 
  when ([dbo].[YearsInService]([DateEngaged],getdate()) = 0) then (0) 
  when ([dbo].[YearsInService]([DateEngaged],getdate()) = 1) then (4) 
  when ([dbo].[YearsInService]([DateEngaged],getdate()) = 2) then (8)
  when ([dbo].[YearsInService]([DateEngaged],getdate()) = 3) then (12)
  when ([dbo].[YearsInService]([DateEngaged],getdate()) = 4) then (32) 
  when ([dbo].[YearsInService]([DateEngaged],getdate()) = 5) then (40) 
  when ([dbo].[YearsInService]([DateEngaged],getdate()) = 6) then (48) 
  when ([dbo].[YearsInService]([DateEngaged],getdate()) = 7) then (56) 
  when ([dbo].[YearsInService]([DateEngaged],getdate()) = 8) then (104) 
  when ([dbo].[YearsInService]([DateEngaged],getdate()) = 9) then (117) 
  when ([dbo].[YearsInService]([DateEngaged],getdate()) >= 10) then (150) 
  else (-1) end

[dbo].[YearsInService]([DateEngaged],getdate()) を評価前に変数に保存する必要があります。

于 2013-04-08T13:44:38.690 に答える