【问题标题】:Conditional inner join & CASE条件内连接和 CASE
【发布时间】:2020-04-09 15:02:25
【问题描述】:

使用甲骨文。我有一个看起来像这样的表:

  COLUMN1  COLUMN2
1 A1       B1
2 A2       B2
3          B3
4 A3
5          B4
6          B5
7 A4       B6

我使用 COLUMN1 作为主键来映射到另一个表。但是,COLUMN1 的某些行是空的,在这种情况下,建议我使用 COLUMN2 值作为主键(如第 5 行和第 6 行)。

1) 是否可以用 CASE 编写条件 INNER JOIN 语句?类似的东西

CASE WHEN
COLUMN1 IS NULL 
THEN INNER JOIN ...... ON column1 = ....
ELSE
INNER JOIN ...... ON column2 = ....
END (???)

2) 我的朋友向我建议的另一个选项是创建一个新列,其行值主要来自 COLUMN1,如果 COLUMN1 对于该行为空,则其次来自 COLUMN2。 我将如何使用 NVL 和 CASE 执行此操作?所需的结果如下,NEW_COLUMN 将是我的映射主键:

  NEW_COLUMN
1 A1       
2 A2       
3 B3
4 A3
5 B4
6 B5
7 A4

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    主键列不能有重复值。从概念上讲,主键列是行的唯一标识符,因此,其中可能没有 NULL 值。设计可能需要以不同的方式加入。

    话虽如此,使用多列的条件 JOIN 看起来像这样

    Select ColA, ColB, ColC
    From Table1 T1
    Join Table2 T2
        On NVL (T1.Col1, T1.Col2) = NVL (T2.Col01, T2.Col02)
    

    你也可以像这样生成一个新列

    Alter Table1 Add Col3  NUMBER GENERATED ALWAYS AS NVL (Col1, Col2) STORED;
    

    【讨论】:

      【解决方案2】:

      CASE 是一个表达式,如+。它不控制代码。您可以使用以下内容:

      select . . .
      from table1 t1 join
           table2 t2
           on t2.col = coalesce(t1.col1, t1.col2)
      

      通常,两个left joins 的性能更好:

      select . . .,
             coalesce(t21.colx, t22.colx) as colx
      from table1 t1 join
           table2 t21
           on t21.col = t1.col1 left join
           table2 t22
           on t22.col = t1.col2 and t1.col1 is null;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-26
        • 2011-11-08
        • 1970-01-01
        • 2020-07-20
        • 1970-01-01
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多