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

时间:2013-08-17 09:18:20

标签: oracle select join split case

很抱歉这个令人困惑的标题。我第二次读它的时候自己并不理解。

所以这里是详细说明。

我有一张表说“奖励”,其中包含以下列: 名称, 量, 雇员

和另一个表“Employee”,其中包含以下列: EMP_ID, EMP_NAME

并且在“奖励”表的员工列中,我有值“01,20”,它实际上是“员工”表中引用的员工ID。

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

3 个答案:

答案 0 :(得分:1)

下面给出了以行的形式获取逗号分隔的员工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   )

答案 1 :(得分:1)

这是一种方法:

select a.*, e.EmpName
from Awards a join
     Employees e
     on ','||a.employee||',' like '%,'||e.emp_id||',%';

这将在不同的行上返回员工姓名。如果你想要它们在列表中,那么你需要将它们连接在一起(这样做的最佳功能取决于你的Oracle版本)。

顺便说一下,这是一个非常糟糕的数据结构,你应该有一个关联表AwardEmployee,每行和每个员工都有一行。

答案 2 :(得分:0)

我更改了数据库(添加了一个表)。并且已经开始更改CODE,就像上面的报告我使用了以下

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

这是暂时的,我对它的理解非常少。

感谢您的帮助和建议。