如何在oracle查询中将字符与#匹配

Posted

技术标签:

【中文标题】如何在oracle查询中将字符与#匹配【英文标题】:How to match the chracters with # in oracle query 【发布时间】:2016-08-26 11:07:43 【问题描述】:

事件表

我有如下事件表,我需要匹配客户表中的客户列表。我如何在 oracle 中做到这一点?

INCIDENT_ID |CLIENTS_LIST     |
------------|-----------------|
56          |A001##A05M##A0AS |

客户表

BO_NAME               |COMPANYID
----------------------|---------
Test1                 |A001     
Test2                 |A0AS     
Test3                 |A05M      
Test4                 |A0BT     

我正在尝试将 companyid 与 clients_list 匹配,但没有结果。

尝试查询

 SELECT DISTINCT INCIDENT_ID,
                 CLIENTS_LIST,
                 REPLACE(CLIENTS_LIST, '##', ',') AS client_id,
                 cl.BO_NAME,
                 COMPANYID
   FROM incident ir 
   INNER JOIN Client cl
     ON  cl.companyid IN (REPLACE(CLIENTS_LIST, '##', ','))

预期输出

BO_NAME               |COMPANYID
----------------------|---------
Test1                 |A001     
Test2                 |A0AS     
Test3                 |A05M      

【问题讨论】:

我怀疑如果你执行SELECT REPLACE(CLIENTS_LIST, '##', ',') FROM INCIDENT 你不会得到匹配 CLIENT.COMPANYID 的值。 Oracle 不会神奇地解析字符串并将它们分解,无论是通过逗号还是井号或其他方式。您可能想查看this question and its highest-ranked answer。祝你好运。 【参考方案1】:

我发现那里存在设计问题,您应该始终将每个值保存在单独的列中,或者以一对多的关系保存在单独的表中。

现在,您不会进行有效的查询,或者至少不会尽可能高效。考虑到这一点,您可以将LIKE Operator 与CROSS JOIN 结合使用。这个查询效率很低,但应该可以:

SELECT *
FROM incidentTable t, clientTable c
WHERE t.IncidentId = 56 AND '#' || t.ClientList || '#' LIKE '%#' || c.CompanyId || '#%' 

【讨论】:

你能告诉我我需要如何运行 +1:但请注意,这是基于 companyIds 的一致命名策略。如果您可能有 companyIds,其中一个的前缀是另一个的值(例如 A10 和 A101),那么这将需要是 AND '#' || t.ClientList || '#' LIKE '%#' || c.CompanyId || '#%'(是的,连接运算符是正确的) 我不清楚。你能在这个查询中加入 2 个表吗 @symcbean 是的,你是对的,我走了修改我的答案 @QuestionUser 查看关于cross join 的链接我回答了CROSS JOIN(由于from 子句中的, 而在我的查询中使用它)加入每条记录第一个表包含第二个表中的所有记录。【参考方案2】:

你可以使用oracle instr

with inc(INCIDENT_ID,CLIENTS_LIST) as (select 56, 'A001##A05M##A0AS' from dual),
     Client(BO_NAME,COMPANYID) as 
     (select 'Test1','A001' from dual union all
      select 'Test2','A0AS' from dual union all
      select 'Test3','A05M' from dual union all
      select 'Test4','A0BT' from dual )

select * 
  from inc, client
 where instr(clients_list,companyid) > 0


INCIDENT_ID CLIENTS_LIST     BO_NAME COMPANYID
----------- ---------------- ------- ---------
         56 A001##A05M##A0AS Test1   A001      
         56 A001##A05M##A0AS Test2   A0AS      
         56 A001##A05M##A0AS Test3   A05M  

【讨论】:

以上是关于如何在oracle查询中将字符与#匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何从用java编写的查询中将虚线字符串传递给oracle

oracle10g中,如何查询正则表达式匹配指定字符串的匹配个数?

Oracle中将查询出的多条记录的某个字段拼接成一个字符串的方法

oracle中如何使用like来进行模糊匹配

oracle10g中,如何查询正则表达式匹配指定字符串的匹配个数?

oracle 中查询的模糊匹配