列中的Oracle逗号分隔值(ID)。如何获取逗号分隔字符串中每个值的说明。

列中的Oracle逗号分隔值(ID)。如何获取逗号分隔字符串中每个值的说明。,oracle,select,join,split,case,Oracle,Select,Join,Split,Case,对不起,标题很混乱。我自己在第二次阅读时也不明白 下面是详细的描述 我有一个表格,上面有以下列: 名称 数量 雇员 以及另一个具有以下列的表Employee: Emp_Id, Emp_名称 在奖励表的employee列中,我有一个值01,20,它实际上是引用到employee表的员工ID 那么,有什么方法可以在“选择奖励”查询中获取员工姓名吗?下面给出的查询是以行的形式获取逗号分隔的员工ID,我将其放入子查询中以获取他们的姓名。请根据您的要求进行编辑 Select Ename from em

对不起,标题很混乱。我自己在第二次阅读时也不明白

下面是详细的描述

我有一个表格,上面有以下列: 名称 数量 雇员

以及另一个具有以下列的表Employee: Emp_Id, Emp_名称

在奖励表的employee列中,我有一个值01,20,它实际上是引用到employee表的员工ID


那么,有什么方法可以在“选择奖励”查询中获取员工姓名吗?

下面给出的查询是以行的形式获取逗号分隔的员工ID,我将其放入子查询中以获取他们的姓名。请根据您的要求进行编辑

 Select Ename from  employee where employee_id in (
 SELECT trim(x.column_value.extract('e/text()')) COLUMNS
  from awards t, table (xmlsequence(xmltype('<e><e>' || replace(Employee,':','</e><e>')||  
  '</e></e>').extract('e/e'))) x   )
这里有一种方法:

select a.*, e.EmpName
from Awards a join
     Employees e
     on ','||a.employee||',' like '%,'||e.emp_id||',%';
这将在单独的行中返回员工姓名。如果您希望将它们列在一个列表中,那么您需要将它们连接在一起,而实现这一点的最佳功能取决于您的Oracle版本


顺便说一句,这是一个非常糟糕的数据结构,您应该有一个关联表AwardEmployee,其中每行和每名员工对应一行。

我已经更改了数据库并添加了一个表。并且已经开始修改代码,至于我使用的报告

WITH t AS
   (
      Select emp_name from  employee where  emp_id in (
        select regexp_substr(Employee ,'[^,]+', 1, level) from awards 
        connect by regexp_substr((select Employee from awards ), '[^,]+', 1, level) is
        not null)
   )
SELECT  LTRIM(SYS_CONNECT_BY_PATH(emp_name, ','),',') emp_name
FROM ( SELECT emp_name,
       ROW_NUMBER() OVER (ORDER BY emp_name) FILA
       FROM t )
WHERE CONNECT_BY_ISLEAF = 1
START WITH FILA = 1
CONNECT BY PRIOR FILA = FILA - 1
这是暂时的,我对此了解甚少


感谢您的帮助和建议。

是的,请更改您的模式,奖励表应在每个奖励/员工关系中修改一行。如果你想正常化,这可能意味着多了一个表。@Mat谢谢你的建议,是的,这是正确的方法,但在我的情况下,如果我改变了表的设计,我将不得不改变代码插入,在应用程序页面上更新,我现在不想跳进代码。你越是等着改变,它会变得越来越难。是的,我很快就会开始更改它。但现在我真的需要一份报告使用它。让我猜猜,一个前端应用程序开发人员创建了db schemaThanks以供回复。我尝试了查询,但无法将where子句添加到sub queryselect trim列。。。。我一直收到SQL命令未正确结束的错误。我还认为,若奖励中的Employee列的值为“6,26”,那个么我将得到两行不同的数据。相反,我希望“Prashant,Anil”只在可能的情况下出现在一列中。再次感谢。1这里有一个额外的括号,它会给你带来问题2。如果你有不同的名字,请重新计算。