【发布时间】:2023-03-26 10:46:01
【问题描述】:
我正在尝试如下查询一个字符串。
目前我的 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'
子查询在哪里返回输出,就像在工作查询中一样。
我认为神谕采用“||”仅在硬编码时才使用 concat 运算符。
我可以尝试什么来解决这个问题?
【问题讨论】:
-
这在 SQL 中从未被称为“管道”运算符。这仅在 unix shell 脚本中。
-
你必须使用动态SQL来达到你想要的结果。您的第一个查询中的 col1||col2 正在获取列中的 VALUES 并将它们组合起来。您的第二个查询是组合 COLUMN 名称,而不是值,以与 %string% 进行比较。因此,您的第二个查询基本上是返回字符串 'Col1||Col2||Col3...' 并将其与 %string% 进行比较。这与第一个查询有很大不同。为了实现我认为你所追求的,你必须使第二个查询成为连接子查询结果的字符串,然后
execute (str); -
请注意,如果
Col2以st结尾并且Col3以ring开头,则您的“工作”查询可能不匹配。您必须决定这是否有问题。 -
如果您需要这样做,这可能表明设计错误。也许您应该重新考虑您的数据库模型。或者您可以考虑连接所有列的计算列,然后您只需要查询单个列。或者考虑使用 Oracle 的全文搜索功能
标签: sql oracle oracle11g oracle10g