1

アクセスコードをsql2008に変換しようとしていますが、sql2008がIIFステートメントをサポートしていないことがわかりました。クエリを書き直そうとしている2つの方法は、次のとおりです。構文を台無しにしていることがわかります。

select distinct (IIf(IsNull([dbo_TASK]![act_start_date])
,IIf(IsNull([dbo_TASK]![restart_date]),[dbo_TASK]![target_start_date],[dbo_TASK]![restart_date]),[dbo_TASK]![act_start_date]) AS [Estimated Start Date] from dbo.task

ATTEMPT1:
if dbo.task.act_start_date=null
    then
        if(dbo.task.restart_date=null)
            then dbo.task.target_start_date
        else dbo.task.restart_date
    else dbo.task.act_start_date


ATTEMP2:
select (case when dbo.task.act_start=null then 
                (case when dbo.task.restart_date=null
                then (dbo.task.target_start_date)
                else dbo.task.restart_date
                end)                
    else (dbo.task.act_start_date)
    end) from dbo.task
4

1 に答える 1

4

あなたの質問は非常に近かったです。値が等しいかどうかを確認するときは、notnullを使用しますIs Null=null

したがって、それを実装すると、次を使用できます。

select distinct 
    case 
        when [act_start_date] is null
        then 
            case 
                when [restart_date] is null
                then [target_start_date]
                else [restart_date]
        else [act_start_date] 
    end AS [Estimated Start Date] 
from dbo.task

COALESCE()または、最初の null 以外の値を返すより簡単に使用できます。

select distinct 
    coalesce([act_start_date], [restart_date], [target_start_date]) as [Estimated Start Date] 
from dbo.task
于 2013-01-31T21:24:53.837 に答える