Oracle 查询列中的逗号分隔值
Oracle Query on Comma Separated Values In a Column
我有两个 table。一个 table 是访问点列表。另一个是谁有权访问什么的列表。
它曾经是一个人可以访问一件事或所有事情。但是,现在情况发生了变化。现在有人可能可以访问多个点。
系统中的扳手是,在显示他们有权访问的内容的列中可能只有一个值,"ALL" 用于所有访问或逗号分隔列表(这是新的)。
我原本以为我可以做 WHERE Access_To Here IN()
,但我不确定如何将 Access_To 的值转换为格式化列表。
我需要能够将此作为单个查询来执行,因为我将它用于 APEX 中的 LOV。
所以,我需要一些帮助。
Access_Points_Table 只有一列,Access_Points。以下是它可能具有的一些示例值:
CSX
CZR
XR3
NBO
QHG
Users_List table 有几列,但最重要的是 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,它将 return 行:
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 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
在您的 OP 中的逗号后有空格,它确实会增加一些复杂性,但可以克服,只需 REPLACE(ul.Access_To, ' ')
.
顺便说一句,我确实想知道为什么:ul.wwid = 'ZZ999'
在 ON
子句中而不是在 WHERE
子句中。
另一种方法是使用 instr 测试:
SELECT 不同的 access_points 值
FROM access_points_表一
加入 users_list 你
ON ( INSTR(u.access_to,a.access_points,1) > 0 )
按 1
排序
我有两个 table。一个 table 是访问点列表。另一个是谁有权访问什么的列表。
它曾经是一个人可以访问一件事或所有事情。但是,现在情况发生了变化。现在有人可能可以访问多个点。
系统中的扳手是,在显示他们有权访问的内容的列中可能只有一个值,"ALL" 用于所有访问或逗号分隔列表(这是新的)。
我原本以为我可以做 WHERE Access_To Here IN()
,但我不确定如何将 Access_To 的值转换为格式化列表。
我需要能够将此作为单个查询来执行,因为我将它用于 APEX 中的 LOV。
所以,我需要一些帮助。
Access_Points_Table 只有一列,Access_Points。以下是它可能具有的一些示例值:
CSX
CZR
XR3
NBO
QHG
Users_List table 有几列,但最重要的是 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,它将 return 行:
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 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
在您的 OP 中的逗号后有空格,它确实会增加一些复杂性,但可以克服,只需 REPLACE(ul.Access_To, ' ')
.
顺便说一句,我确实想知道为什么:ul.wwid = 'ZZ999'
在 ON
子句中而不是在 WHERE
子句中。
另一种方法是使用 instr 测试:
SELECT 不同的 access_points 值 FROM access_points_表一 加入 users_list 你 ON ( INSTR(u.access_to,a.access_points,1) > 0 ) 按 1
排序