Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle查询列中以逗号分隔的值_Sql_Oracle_Oracle Apex - Fatal编程技术网

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

Sql Oracle查询列中以逗号分隔的值,sql,oracle,oracle-apex,Sql,Oracle,Oracle Apex,我有两张桌子。一个表是访问点列表。另一个是谁有权访问什么的列表。 它曾经是一个人可以访问一件事或所有事情。但是,现在情况已经改变了。现在可能有人可以访问几个点。 系统中的麻烦在于,在显示他们有权访问的内容的列中,可能有一个值,“ALL”表示所有访问权限,或者是一个逗号分隔的列表(这是新的)。 我原本以为我可以在()中执行WHERE Access\u To Here IN(),但我不确定如何将Access\u的值转换为格式化列表。 我需要能够作为一个查询来完成这项工作,因为我正在APEX中使用它进

我有两张桌子。一个表是访问点列表。另一个是谁有权访问什么的列表。 它曾经是一个人可以访问一件事或所有事情。但是,现在情况已经改变了。现在可能有人可以访问几个点。 系统中的麻烦在于,在显示他们有权访问的内容的列中,可能有一个值,“ALL”表示所有访问权限,或者是一个逗号分隔的列表(这是新的)。 我原本以为我可以在()中执行
WHERE Access\u To Here IN()
,但我不确定如何将Access\u的值转换为格式化列表。 我需要能够作为一个查询来完成这项工作,因为我正在APEX中使用它进行LOV。 所以,我需要一些帮助

Access\u Points\u表只有一列,即Access\u Points。以下是它可能具有的一些示例值:

CSX
CZR
XR3
NBO
QHG
Joe | ALL
Fred | CSX
Allen | CZR, NBO
Hank | QHG
Users\u List表有几列,但最重要的是User\u Name、Access\u To。以下是它可能具有的一些示例值:

CSX
CZR
XR3
NBO
QHG
Joe | ALL
Fred | CSX
Allen | CZR, NBO
Hank | QHG
这是我当前使用的查询,但它仅在Access\u 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

根据逗号分隔数据的长度,可以使用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 ',' || ul.Access_To || ',' LIKE '%,' || apt.symbol_name || ',%' ) )
 ORDER BY name ASC
请注意,如果您的OP中
Access\u To
的逗号后有空格,这确实会增加一些复杂性,但这是可以克服的,只需
替换(ul.Access\u To“”)


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

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

选择不同的访问点值 从访问点到表a 加入用户列表 ON(仪表(u.访问,a.访问点,1)>0)
ORDER BY 1

存储逗号分隔的值是糟糕设计的标志。另外,
中的
也不起作用。可能是重复的。粘贴了错误的链接。我的意思是:“复制”。也许这是一个糟糕的设计,但不幸的是,我不是DBA,只是开发人员。很抱歉听到这个消息。这是开发人员可能会犯的错误,但知道规范化的专用DBA不应该犯。无论如何,我想你可以在我提供的链接中找到答案。