在 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 developer 中加入查询快,在 odp.net 中超慢