如何在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查询中将字符与#匹配的主要内容,如果未能解决你的问题,请参考以下文章
oracle10g中,如何查询正则表达式匹配指定字符串的匹配个数?
Oracle中将查询出的多条记录的某个字段拼接成一个字符串的方法