当前位置: 首页 > 面试题库 >

Oracle 12:加入逗号分隔的列表吗?

杜晨朗
2023-03-14
问题内容

假设我有一个名为“ companies”的视图,该视图无法修改:

+------------+--------------------+--------+--------+------------------------+
| company_id | company_name       | ceo    | cfo    | legal_contacts         |
+------------+--------------------+--------+--------+------------------------+
| 1          | johnson and son    | pid111 | pid333 | pid444, pid567, pid999 |
| 2          | Pepperville apples | pid777 |        | pid345                 |
| 3          | Cats LTD           | pid123 | pid321 |                        |
+------------+--------------------+--------+--------+------------------------+

还有一个称为“联系人”的视图:

+-----------+-------+----------------------+
| person_id | name  | email                |
+-----------+-------+----------------------+
| pid111    | john  | john@gmail.com       |
| pid333    | steve | funkylover@mail.com  |
| pid444    | mary  | mar123@ymail.com     |
| pid999    | joe   | joe.bloggs@gmail.com |
| pid777    | louis |                      |
| pid345    | carol | carol@carolssite.com |
| pid321    | ellen | ellen.deg@gmail.com  |
+-----------+-------+----------------------+

最终目标是让我编写一个查询,该查询可以交叉引用人员ID并显示电子邮件和公司,例如:

+---------+----------------+-----------------------------------------+
| company | ceo            | legal_contacts                          |
+---------+----------------+-----------------------------------------+
| 1       | john@gmail.com | mary123@ymail.com, joe.bloggs@gmail.com |
| 2       |                | carol@carossite.com                     |
| 3       |                |                                         |
+---------+----------------+-----------------------------------------+

我有没有办法在不编写函数或过程的情况下在查询中加入或处理此逗号分隔的标识符列表?

您可以假设“合法联系人”最多具有25个标识符,且始终采用相同格式,且始终用逗号分隔


问题答案:

您可以拆分companies.legal_contacts使用正则表达式的列表,然后将结果集与联系人联系以获取电子邮件地址(也可以两次联系以获取ceo邮件),然后使用listagg函数重新连接电子邮件:

SELECT co.company_id, p1.email, LISTAGG(p2.email, ', ') WITHIN GROUP (ORDER BY p2.email)
  FROM (
        SELECT DISTINCT company_id, ceo, REGEXP_SUBSTR(legal_contacts, '[^, ]+', 1, LEVEL) AS single_contact   
          FROM COMPANIES
       CONNECT BY REGEXP_SUBSTR(legal_contacts, '[^, ]+', 1, LEVEL) IS NOT NULL) co
  LEFT JOIN CONTACTS p1 ON co.ceo = p1.person_id
  LEFT JOIN CONTACTS p2 ON co.single_contact = p2.person_id
 GROUP BY co.company_id, p1.email;

如果companies.legal_contacts可以包含许多值,则由于性能原因,正则表达式的使用会有所变化,因此您必须使用MULTISET。



 类似资料:
  • 问题内容: 我有看起来像这样的数据: 对于每个customer_id,我需要用逗号分隔的列表,以指示该客户运营的月份: 等等。如何使用SQL Server 2005 SQL(而不是T-SQL)轻松生成此逗号分隔的列表? 我在Stack Overflow和其他地方在这里看到的大多数解决方案似乎都是基于联接多个行值而不是列值来创建逗号分隔的列表: T-SQL FOR XML路径(’‘) 关联的子查询与

  • 问题内容: 我需要运行类似的查询: 但是我希望子选择返回逗号分隔的列表,而不是数据列。这有可能吗?如果可以,怎么办? 问题答案: 您可以使用GROUP_CONCAT执行该操作,例如

  • 问题内容: 我正在尝试输出以逗号分隔的链接列表,这是我的解决方案。 我只是想知道是否有更好,更干净的方法来实现这一目标? 谢谢 问题答案: 在可汗学院,我们使用一个为此而需要的帮助器: 它允许您编写如下代码:

  • 问题内容: 我正在编写一段代码,该代码应该输出用逗号分隔的项目列表。该列表是通过for循环生成的。我用 问题是我不知道如何摆脱列表中最后一个条目添加的最后一个逗号。它输出以下内容: 如何删除结尾的’,’? 问题答案: 传递给 您几乎可以使用print语句。 不需要循环,print具有以及参数。 一点解释 所述内置需要作为要打印参数中的任何数量的项目。将打印所有非关键字参数,并用分隔。的默认值为单个

  • 问题内容: 我有一个未标准化的表,其中的列包含逗号分隔的列表,该列表是另一个表的外键: 我想将此数据读入不提供过程语言的搜索引擎中。 那么,有没有一种方法, 要么 就这一栏中加入 或 该数据运行查询插入相应的条目到一个新的表?结果数据应如下所示: 如果DBMS支持返回表的函数,但MySQL显然不支持,我可以想到一个解决方案。 问题答案: 在MySQL中,可以通过以下方式实现 现在要获取逗号分隔的v

  • 问题内容: 我需要这个问题的帮助。 在MYSQL表中,我有一个字段: 我需要找到艺术家uid 401的所有记录 我做这个 我所有记录的artist_list字段值仅是“ 401”,但是如果我有11,401,则此查询不匹配。 任何的想法 ? (我无法使用LIKE方法,因为如果艺术家uid为3(匹配30、33、3333)… 问题答案: 短期解决方案 使用FIND_IN_SET函数: 长期解决方案 标准