2016-02-12 69 views
-1

我使用在我的WHERE子句这样CASE表达式:如何在WHERE子句中使用CASE表达式?

SELECT *  
FROM ASPECT.WR_AM_ADT_SUMM 
INNER JOIN ASPECT.WR_AM_DLR_DTL 
ON AS_CNTRY_CD = DD_CNTRY_CD AND 
    AS_DLR_CD = DD_DLR_CD AND 
    AS_YEAR = DD_YEAR 
RIGHT JOIN ASPECT.DEALER_MASTER 
ON COUNTRY_CD = AS_CNTRY_CD AND 
    DEALER_CDE_VEGA = AS_DLR_CD 
WHERE 
    COUNTRY_CD = '81930' AND 
    LANG_CD = '02' AND 
    (CASE PARM_ADTR_ID 
     WHEN 'ALL' THEN (AS_ADTR_ID_P IS NULL OR AS_ADTR_ID_P LIKE '%') 
     ELSE AS_ADTR_ID_P LIKE LOC_ADTR_ID 
    END) AND 
    DEALER_CDE_VEGA LIKE '8%' 
    ; 

在上述查询时我通过“ALL”在PARM_ADTR_ID输入参数然后第一条件应该工作,否则所述第二条件应该工作。

截至目前它给语法错误,有谁能告诉我如何做到这一点?

+0

1]保存自己将来头痛,始终使'FROM'引用表与保证是有行,和任何“可选”'LEFT JOIN'ed(本质上,翻转当前的一些引用)。 2]永远不要使用'SELECT *',总是明确列出你的输出列。 3]只要“AS_ADTR_ID_P”永远不为空,“全部”条件是不必要的。没有通配符的'LIKE'与'='相同。 4] **语法错误是什么**?所需的信息,并可能是一个很大的线索给你。不过,我期望它抱怨说'PARM_ADTR_ID'实际上并没有被引用为主变量。 –

回答

2

我不相信在案例表达式中,您可以进行逻辑测试,结果为result-rexpressionTHEN右侧的布尔值。

我通常做这没有一个case语句

WHERE 
    COUNTRY_CD = '81930' 
    and LANG_CD = '02' 
    and DEALER_CDE_VEGA LIKE '8%' 
    and (PARM_ADTR_ID = 'ALL' 
      or AS_ADTR_ID_P LIKE LOC_ADTR_ID 
     ) 

只有OR条款中的一项必须是真实的。虽然我希望看到PARM_ADTR_ID两次像这样:

WHERE 
    COUNTRY_CD = '81930' 
    and LANG_CD = '02' 
    and DEALER_CDE_VEGA LIKE '8%' 
    and (PARM_ADTR_ID = 'ALL' 
      or AS_ADTR_ID_P LIKE parm_adtr_id 
     ) 
+0

如果'parm_adtr_id'应该是一个掩码,将'ALL'放入它意味着'%'可能会造成混淆。那么如何使用它来搜索“ALL”的实际值呢? –