使用select中的case语句在SQL中创建视图

时间:2014-02-26 19:25:49

标签: sql sql-server tsql view syntax

我知道我的语法一定有问题,但我似乎无法弄明白。

我希望从prop_and_cas_dtl_prdct_descexpir_prop_and_cas_dtl_prdct_cd填充此列ren_prop_and_cas_dtl_prdct_cd,具体取决于type_indicator中的值,但在进入prop_and_cas_dtl_prdct_desc之前,它应该看起来从prop_and_cas_dtl_prdct_desc开始pc_ref_detail_product_cd并选择与其expir_prop_and_cas_dtl_prdct_cdren_prop_and_cas_dtl_prdct_cd对应的一个。

我为可怕的缩进道歉,我知道这很难读,但这是我知道怎么做的最佳方式。

select
,ren_prop_and_cas_dtl_prdct_cd
...
,p_and_c_cd
,case when type_indicator in ('R','C') then 
    select prop_and_cas_dtl_prdct_desc
from  pc_ref_detail_product_cd a inner join op_pif_coverage_rpc_new b
on a.prop_and_cas_dtl_prdct_cd = b.expir_prop_and_cas_dtl_prdct_cd

else when type_indicator in ('N','O') then 
    select prop_and_cas_dtl_prdct_desc 
from pc_ref_detail_product_cd  a inner join op_pif_coverage_rpc_new b
on a.prop_and_cas_dtl_prdct_cd = b.ren_prop_and_cas_dtl_prdct_cd

else NULL
 END
AS prop_and_cas_dtl_prdct_desc
FROM         dbo.op_pif_coverage_rpc_new

以下是我用来创建参考表的代码

create table pc_ref_detail_product_cd(
prop_and_cas_dtl_prdct_cd char(2),
prop_and_cas_dtl_prdct_desc  char(30)
)

insert into pc_ref_detail_product_cd (prop_and_cas_dtl_prdct_cd,     prop_and_cas_dtl_prdct_desc) 
values ('01', 'CORE'),
('02', 'FORECLOSED'),
('04', 'TRUST'),
('06', 'MORTGAGE HOLDERS E&O'),
('07', 'SECURITY INTEREST E&O')

2 个答案:

答案 0 :(得分:2)

如果需要根据附加列中的值选择不同表中的列,则需要在查询中包含所有表,并使用适当的JOIN而不是像这样的用例语句

SELECT CASE WHEN a.MyColumn = 0 THEN b.SomeColumn
            WHEN a.MyColumn = 1 THEN a.SomeColumn
       END AS SomeColumn
    FROM MyTableA AS a
    JOIN MyTableB AS b
        ON a.ID = b.ID

而不是在case语句中使用select语句,您只需从以太表中选择每个特定情况所需的列。

答案 1 :(得分:0)

我明白了。这是我使用的SQL。对不起,如果我在原始问题中的可怕代码中不知道我想做什么。

select
,ren_prop_and_cas_dtl_prdct_cd
...
,p_and_c_cd
,case when type_indicator in ('R','C') then 
(select prop_and_cas_dtl_prdct_desc
from  pc_ref_detail_product_cd a where expir_prop_and_cas_dtl_prdct_cd = prop_and_cas_dtl_prdct_cd)

when type_indicator in ('N','O') then 
(select prop_and_cas_dtl_prdct_desc 
prop_and_cas_dtl_prdct_desc
from  pc_ref_detail_product_cd a where ren_prop_and_cas_dtl_prdct_cd = prop_and_cas_dtl_prdct_cd)

else NULL
END
AS prop_and_cas_dtl_prdct_desc
FROM         dbo.op_pif_coverage_rpc_new