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