web-dev-qa-db-ja.com

単一のSQL CASEステートメントで複数の列を取得する方法は?

単一のCASEステートメントから複数の列(この場合は被保険者コード、被保険者名)を取得しようとしています。

次のクエリが試行されましたが、insuredcodeとinsurednameの両方を1つの列として連結します。

このようなCASEステートメントから正確に2列を返すための正しい構文は何ですか?

select
    case
        when a.policyno[2] in ('E', 'W') then c.insuredcode || c.insuredname
        else b.insuredcode || b.insuredname
    end
from prpcmain a
left join prpcinsured_1 b on b.proposalno=a.proposalno 
left join prpcinsured_2 c on c.proposalno=a.proposalno
where a.policyno in (select policyno from policyno_t);
8
Michael.Y

CASEステートメントは、複数の列ではなく単一の列のみを返すことができます

これを行うには、2つの異なるCASEステートメントが必要です。

select
    case
        when a.policyno[2] in ('E', 'W') then c.insuredcode 
        else b.insuredcode 
    end as insuredcode ,
    case
        when a.policyno[2] in ('E', 'W') then  c.insuredname
        else b.insuredname
    end as insuredname
from prpcmain a
left join prpcinsured_1 b on b.proposalno=a.proposalno 
left join prpcinsured_2 c on c.proposalno=a.proposalno
where a.policyno in (select policyno from policyno_t);
12

私は少し速いかもしれない何か他のものを提案することができます:

SELECT s.insuredcode,s.insuredname FROM (
    SELECT a.policyno,b.insuredcode,b.insuredname
    FROM prpcmain a
    left join prpcinsured_1 b on b.proposalno=a.proposalno 
    WHERE a.policyno[2] not in ('E', 'W')
    UNION ALL
    SELECT a.policyno,c.insuredcode,c.insuredname
    FROM prpcmain a
    left join prpcinsured_2 c on c.proposalno=a.proposalno 
    WHERE a.policyno[2]  in ('E', 'W')
) s
where s.policyno in (select policyno from policyno_t);

あなたの質問に関しては、 @ Prdp はあなたがする必要があることを示しています。

1
sagi

これは、任意の言語のif/else条件に似ており、条件をWhenステートメントで定義できます。trueの場合、SQLはThenステートメントを実行し、そうでない場合は実行します- Else part、以下で説明します:

     Select 
                 CASE 
                    WHEN (cs.ResultSubmitToHOD = 1) THEN 'HOD'
                    WHEN (cs.ResultSubmitToExamDep = 1) THEN 'Exam'
                    ELSE 'Teacher'
                END AS ResultSubmitStatus
     From dbo.CourseSection as cs
1
Luqman Cheema