首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >替换Where子句中的concat操作

替换Where子句中的concat操作
EN

Stack Overflow用户
提问于 2013-01-27 01:57:14
回答 3查看 2.6K关注 0票数 2

我们需要根据模式名和表名的组合来查询ALL_TABLES视图。

有两个模式"A“和" B”,并且它们都有相同的表"TAB1“,这里我的要求是选择与模式A关联的表,而不是模式B。

目前,我们正在对表名和所有者名进行拼接操作,如下所示

在单个查询中将有多个所有者和表名组合可用

代码语言:javascript
运行
复制
select table_name from all_tables where concat(owner_name,table_name) in ('ATAB1','ATAB2','BTAB2','CTAB1') 
select table_name from all_tables where concat(owner_name,table_name) not in ('ATAB1','ATAB2','BTAB2','CTAB1')

这里有三个模式A、B和C,以及它们各自的表名组合

如果不使用CONCAT函数,我们如何才能获得相同的结果呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-27 02:29:19

代码语言:javascript
运行
复制
WHERE 0=1
 OR (owner_name = 'A' AND table_name = 'T1')
 OR (owner_name = 'B' AND table_name = 'T2')
 OR (owner_name = 'A' AND table_name = 'T3')

奇怪的0=1只是为了便于维护和/或代码生成,使下面的代码行在语法上完全相同。优化器会将其删除。

票数 2
EN

Stack Overflow用户

发布于 2013-01-27 02:56:42

您可以将需要匹配的字符串值排列到一个虚拟表中,然后在连接中使用该表作为筛选器:

代码语言:javascript
运行
复制
SELECT t.*
FROM all_tables t
INNER JOIN (
  SELECT 'A' AS owner_name, 'TAB1' AS table_name FROM DUAL
  UNION ALL SELECT 'A', 'TAB2' FROM DUAL
  UNION ALL SELECT 'B', 'TAB2' FROM DUAL
  UNION ALL SELECT 'C', 'TAB1' FROM DUAL
) s
 ON t.owner_name = s.owner_name
AND t.table_name = s.table_name
;

我希望这会给查询规划器提供比你现在的方法更多的优化空间。

票数 1
EN

Stack Overflow用户

发布于 2013-01-27 03:13:03

Oracle允许在一个IN条件中包含多个列(有关更多示例,请参阅documentation )。

代码语言:javascript
运行
复制
select table_name
  from all_tables
 where (owner_name, table_name) in
         (('A','TAB1'), ('A','TAB2'), ('B','TAB2'), ('C','TAB1'))

就性能而言,这可能等同于usr's answer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14539821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档