Oracle查询以逗号分隔列中的值

时间:2015-01-26 21:27:10

标签: sql oracle oracle-apex

我有两张桌子。一个表是接入点列表。另一个是谁有权访问什么的列表。 它可以是一个人可以访问任何一件事或所有事情。但是,现在已经改变了。现在有人可以访问几个点。 系统中的扳手是在列中显示他们可以访问的内容可能只有一个值," ALL"用于所有访问或以逗号分隔的列表(这是新的)。 我原本以为我可以做WHERE Access_To Here IN(),但我不确定如何将Access_To的值转换为格式化列表。 我需要能够将其作为单个查询执行,因为我将其用于APEX中的LOV。 所以,我需要一些帮助。

Access_Points_Table只有一列Access_Points。以下是它可能具有的一些示例值:

CSX
CZR
XR3
NBO
QHG

Users_List表有几列,但最重要的是User_Name,Access_To。以下是它可能具有的一些示例值:

Joe | ALL
Fred | CSX
Allen | CZR, NBO
Hank | QHG

这是我当前正在使用的查询,但只有在Access_To列中只有一个值时才有效。

SELECT DISTINCT Access_Points VALUE
FROM Access_Points_Table apt
JOIN
Users_List ul
ON (ul.wwid = 'ZZ999'
AND (ul.Access_To = 'ALL' OR apt.symbol_name = ul.Access_To))
ORDER BY name ASC  

我想要完成的是:

SELECT DISTINCT Access_Points VALUE
FROM Access_Points_Table apt
JOIN
Users_List ul
ON (ul.wwid = 'ZZ999'
AND (ul.Access_To = 'ALL' OR apt.symbol_name IN(Something Goes Here)))
ORDER BY name ASC       

因此,如果对用户Allen运行查询,它将返回行:

CZR
NBO

2 个答案:

答案 0 :(得分:0)

根据逗号分隔数据的长度,您可以使用Oracle的正则表达式引擎(难点在于Oracle将正则表达式限制为512字节):

SELECT DISTINCT Access_Points VALUE
  FROM Access_Points_Table apt
  JOIN Users_List ul
    ON ( ul.wwid = 'ZZ999'
   AND ( ul.Access_To = 'ALL'
      OR REGEXP_LIKE(apt.symbol_name, '^(' || REPLACE(ul.Access_To, ',', '|') || ')$') ) )
 ORDER BY name ASC

或者,您可以使用LIKE

SELECT DISTINCT Access_Points VALUE
  FROM Access_Points_Table apt
  JOIN Users_List ul
    ON ( ul.wwid = 'ZZ999'
   AND ( ul.Access_To = 'ALL'
      OR ',' || ul.Access_To || ',' LIKE '%,' || apt.symbol_name || ',%' ) )
 ORDER BY name ASC

请注意,如果Access_To在其逗号后面有空格,那么它会增加一些复杂性,但这可以克服,只需REPLACE(ul.Access_To, ' ')

顺便说一下,我确实想知道为什么:ul.wwid = 'ZZ999'ON子句而不是WHERE子句中。

答案 1 :(得分:0)

另一种方法是使用instr测试:

SELECT DISTINCT access_points VALUE 来自access_points_table a 加入users_list你 ON(INSTR(u.access_to,a.access_points,1)> 0) ORDER BY 1