用另一个表中的多个值替换列值 - DB2

时间:2017-08-31 13:22:50

标签: sql db2 dashdb

我有一个复杂的查询((Q1 union Q2)相交(Q3 union Q4))。现在问题是查询中涉及的列之一具有' Company'的价值。此值可以是特定的公司名称或“全部”的值。这意味着所有公司。我有一个单独的公司表,列出了公司名称。现在的逻辑是,如果cross中的一个查询的值为' ALL'另一个查询是公司' C1',结果应该返回' C1'。但目前自从' ALL'不匹配' C1'作为字符串值,交集不返回任何内容。 无论如何,我可以取代所有' ALL'行值与所有公司名称然后做交叉?我想通过SQL完成所有操作,因为在代码中处理它会非常麻烦。我正在使用基于DB2的DashDB。

3 个答案:

答案 0 :(得分:1)

这应该有效:

select
    company_name
    ,the
    ,other
    ,columns
from 
(
    select distinct
        company_name = ca.company_name
        ,the
        ,other
        ,columns
    from Q1
        inner join companies_table ca
            on Q1.company_name = ca.company_name
            or Q1.company_name = 'ALL'

    union

    select distinct
        company_name = ca.company_name
        ,the
        ,other
        ,columns
    from Q2
        inner join companies_table ca
            on Q2.company_name = ca.company_name
            or Q2.company_name = 'ALL'
) a

intersect

select
    company_name
    ,the
    ,other
    ,columns
from 
(
    select distinct
        company_name = ca.company_name
        ,the
        ,other
        ,columns
    from Q3
        inner join companies_table ca
            on Q3.company_name = ca.company_name
            or Q3.company_name = 'ALL'

    union

    select distinct
        company_name = ca.company_name
        ,the
        ,other
        ,columns
    from Q4
        inner join companies_table ca
            on Q4.company_name = ca.company_name
            or Q4.company_name = 'ALL'
) b

答案 1 :(得分:0)

这是解决我的问题的查询(我从查询中删除了复杂性,只包括与此问题相关的那些部分)

在AA.OBJECT_FILTER_VALUE ='所有&那么AA.OBJECT_FILTER_VALUE ELSE BB.OBJECT_FILTER_VALUE END作为OBJECT_FILTER_VALUE FROM(SELECT OBJECT_TYPE,OBJECT_FILTER_ID,OBJECT_FILTER_VALUE from COMPANY)作为AA INNER JOIN (SELECT OBJECT_TYPE,OBJECT_FILTER_ID,OBJECT_FILTER_VALUE FROM DETAILS)AS BB ON AA.OBJECT_TYPE = BB.OBJECT_TYPE和AA.OBJECT_FILTER_ID = BB.OBJECT_FILTER_ID AND(AA.OBJECT_FILTER_VALUE = BB.OBJECT_FILTER_VALUE或AA.OBJECT_FILTER_VALUE =' ALL'或BB.OBJECT_FILTER_VALUE ='全部')

答案 2 :(得分:0)

  

您可以像这样简化查询:

SELECT AA.OBJECT_TYPE, AA.OBJECT_FILTER_ID, 
CASE WHEN BB.OBJECT_FILTER_VALUE = 'ALL' THEN AA.OBJECT_FILTER_VALUE ELSE BB.OBJECT_FILTER_VALUE END AS OBJECT_FILTER_VALUE 
FROM COMPANY AS AA 
INNER JOIN DETAILS AS BB ON (AA.OBJECT_TYPE, AA.OBJECT_FILTER_ID)=(BB.OBJECT_TYPE, BB.OBJECT_FILTER_ID) 
AND(AA.OBJECT_FILTER_VALUE = BB.OBJECT_FILTER_VALUE OR AA.OBJECT_FILTER_VALUE = 'ALL' OR BB.OBJECT_FILTER_VALUE = 'ALL')