【问题标题】:Conditional Join with replace and case带有替换和大小写的条件连接
【发布时间】:2019-02-25 12:02:38
【问题描述】:

我有两个要加入的表。

情况在表1中默认值为1,那么在表2中默认值为0

Table 1       Table 2
--------     ---------
1            0
1232342      1232342
1241232      1231231

我想连接表1和表2,条件是如果表2是0,那么它将被替换为1。

SELECT T1.ID 
FROM TABLE1 T1, TABLE2 T2
WHERE T1.ID = REPLACE(CASE WHEN T2  = 0 THEN 1 ELSE T2.ID END, 'X', 'E')

使用此语句,它不会返回不是 0 或 1 的其他 id

预期输出

Table 1      
--------     
1           
1232342      

【问题讨论】:

  • 你的预期输出是什么?
  • 您希望通过replace() 实现什么目标?显然它不会影响您发布的示例数据,那么您的意图是什么?
  • 在 WHERE 和 ON 子句中使用 AND/OR 而不是 case 表达式通常会更好。
  • 今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。

标签: sql oracle replace case


【解决方案1】:

将连接与 CASE 结合使用。 replace() 用于字符串值:

select t1.*
from table1 t1
  join table2 t2 on t1.id = case when t2.id = 0 then 1 else t2.id end;

【讨论】:

    【解决方案2】:

    尝试在以下情况下使用案例:

    SELECT * 
        FROM TABLE1 T1 inner join TABLE2 T2
        on T1.ID = (CASE WHEN T2.ID =0 THEN 1 ELSE T2.ID END)
    

    【讨论】:

      【解决方案3】:

      用例何时和子查询

      select t1.* from table1 t1 join    
      (
      select case when t2.id=0 then 1 else t2.id end as id  from table2 t2
      ) as t3 on t1.id=t3.id
      

      【讨论】:

        【解决方案4】:

        切换到现代、明确的JOIN 语法。跳过case 表达式,只需使用AND/OR 代替:

        SELECT T1.ID 
        FROM TABLE1 T1
        JOIN TABLE2 T2
            ON T1.ID = T2.ID OR (T1.ID = 1 and T2.ID = 0) 
        

        或者使用INTERSECT:

        SELECT ID FROM TABLE1
        INTERSECT
        SELECT case when ID = 0 then 1 else id end from TABLE2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-15
          • 1970-01-01
          • 1970-01-01
          • 2012-03-19
          相关资源
          最近更新 更多