使用concat ||的Oracle查询问题操作者

时间:2017-01-03 21:31:39

标签: sql oracle oracle11g oracle10g

我正在尝试按如下方式查询字符串,

目前我的Oracle表有大约60列。因此,查询字符串以反对所有列将如下所示,

工作查询

select * from <table_name> where (col1||col2||col3...||col60) like '%string%'

无效查询

我添加了一个查询以动态获取所有列,如下所示

select * from <table_name> where (select LISTAGG(COLUMN_NAME, '||') WITHIN GROUP (ORDER BY COLUMN_NAME) from all_tab_columns where TABLE_NAME = '<table_name>' and OWNER = '<owner_name>' and DATA_TYPE != 'CLOB') like '%string%'

子查询:

以下子查询没有问题。

select LISTAGG(COLUMN_NAME, '||') WITHIN GROUP (ORDER BY COLUMN_NAME) from all_tab_columns where TABLE_NAME = '<table_name>' and OWNER = '<owner_name>' and DATA_TYPE != 'CLOB'

子查询在工作查询中返回输出的位置。

我在想oracle服用“||” concat运算符只有在硬编码时才会运行。

你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

以下是我将如何以可扩展的方式解决您的问题。

CREATE OR REPLACE VIEW COLUMN_SEARCH AS

SELECT ID, COL1 AS COL
FROM TABLENAME

UNION ALL

SELECT ID, COL2 AS COL
FROM TABLENAME

UNION ALL

SELECT ID, COL3 AS COL
FROM TABLENAME

UNION ALL

SELECT ID, COL4 AS COL
FROM TABLENAME

UNION ALL

--- 

SELECT ID, COLN AS COL
FROM TABLENAME

现在使用此视图,您的查询只是

SELECT TABLENAME.*
FROM TABLENAME
JOIN COLUMN_SEARCH ON TABLENAME.ID = COLUMN_SEARCH.ID
WHERE COLUMN_SEARCH.COL = 'string'

如果您需要它是动态的,那么每次添加新列时都只需更新视图。

如果运行缓慢,则只需在视图中对ID,COL进行索引。

根据评论进行更新

我想添加一些关于使用动态SQL来解决此问题的注释。您可以使用动态SQL来解决此问题,但这不是一个好主意。 (对于那些不了解的人 - 每次运行查询时都会根据列的元数据动态创建查询将使用动态SQL

这就是为什么我不推荐它:

  1. 动态SQL实际上很难维护 - 它(根据定义)比非动态SQL更复杂,它看起来并不是你真正想要运行的查询。虽然它似乎可以使维护更容易&#34;每次我添加一个列它只是自动添加in-bim-bamb-boom!&#34;事实上,我每次添加一个列时都会发现最好做出选择&#34;我是否想要添加它。&#34;有时它会自动添加它,但很多时候会破坏系统。

  2. 动态SQL中断优化 - SQL平台在编译器中内置了数十年的优化,他们的工作非常出色。由于动态SQL无法进行编译和缓存,因此除了创建动态SQL所需的时间外,还会失去很多性能。

  3. 动态SQL无法轻松调整和调整 - DBA所做的很多工作是查看数据模型的使用方式,然后添加索引,分区,物化查询和其他调整使系统快速运行。在动态SQL上进行这种调优要困难得多(但并非不可能)。

  4. 动态SQL是一种糟糕的代码味道 - 这是更微妙的,可能不适用于此特定问题但需要说明 - 如果你使用动态sql可能表明你的数据模型出了问题,或者你使用的是错误的工具。有许多&#34; nosql&#34;那些可能更适合解决您的特定数据问题的系统。