在 Oracle SQL SELECT 语句中加入条件

Posted

技术标签:

【中文标题】在 Oracle SQL SELECT 语句中加入条件【英文标题】:Join under condition in Oracle SQL SELECT statement 【发布时间】:2020-04-29 06:51:35 【问题描述】:

我正在尝试在一个条件下加入两个表,但我无法使其工作。我一直在搜索和阅读,但找不到我的案例的答案。

这是我要实现的基本思想(我用小写写的就是我想用我自己的话实现的,以防你想知道):

SELECT TABLE1.STR_FULLNAME, TABLE1.STR_MAILBIZ, TABLE2.STR_IP
FROM TABLE1
INNER JOIN TABLE2

     if TABLE2.STR_MACHINEUSER contains 'TEXT\' then join like this:
          ON TABLE1.STR_LOGIN = SELECT SUBSTR(STR_MACHINEUSER, 6) AS STR_MACHINEUSER FROM TABLE2 WHERE 
          STR_MACHINEUSER LIKE 'TEXT\%'
     else join like this:
          ON TABLE1.STR_LOGIN = TABLE2.STR_MACHINEUSER

ORDER BY TABLE2.DT_INSERT DESC;

Table1.STR_LOGIN的内容和Table2.STR_MACHINEUSER的内容在某些情况下完全一样,在某些情况下中需要去掉前缀Table2.STR_MACHINEUSER ('TEXT\')。我已经看到应该使用 CASE 表达式处理条件。我尝试了不同的方法,但我无法让它满足我的需要。我在想我可能需要一种完全不同的方法,但我看不出是什么......

有人有建议吗?提前致谢!

【问题讨论】:

为什么这被否决了? 【参考方案1】:

也许这就是你想要的:

SELECT TABLE1.STR_FULLNAME, TABLE1.STR_MAILBIZ, TABLE2.STR_IP
FROM TABLE1
INNER JOIN TABLE2 ON 
  (not TABLE2.STR_MACHINEUSER LIKE 'TEXT\%' and TABLE1.STR_LOGIN = TABLE2.STR_MACHINEUSER)
  or 
  (TABLE2.STR_MACHINEUSER LIKE 'TEXT\%' and TABLE1.STR_LOGIN = SUBSTR(TABLE2.STR_MACHINEUSER, 6))

当然,您可以使用一些 case 结构来缩短您的陈述,例如:

case 
  when TABLE2.STR_MACHINEUSER LIKE 'TEXT\%' 
  then SUBSTR(TABLE2.STR_MACHINEUSER, 6) else TABLE2.STR_MACHINEUSER 
end 

并将其与TABLE1.STR_LOGIN 进行比较,但我发现(恕我直言)第一个(逻辑)连接更具可读性。

【讨论】:

大小写表达式也更难优化。 IE。在 ON 和 WHERE 子句中坚持 AND/OR。 @Cecilia 。 . . ON 子句中的复杂表达式往往会导致无法使用索引并阻碍优化器。如果这是一个问题,请提出另一个关于优化查询的问题。

以上是关于在 Oracle SQL SELECT 语句中加入条件的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle sql 中加入更新

Oracle入门第二天——基本查询SQL

在 oracle sql developer 中加入查询快,在 odp.net 中超慢

在 like 语句中加入 SQL Server 表

在 Oracle SQL Query 中加入(INNER JOIN)本地 Excel 表 - VBA

PYTHON 数据库mysql更新语句中加入变量?