1

请记住,我在这里分两个阶段构建查询。第一阶段是让它与现有的低效查询一起工作。

我一点也不擅长PL/SQL,但我在这里学习得很慢。

我有这个作为查询:

SELECT LOGONID,FIRSTNAME,LASTNAME,ORGNAME
FROM WCSADMIN.USERREG UR,WCSADMIN.ADDRESS A 
WHERE UR.USERS_ID = A.MEMBER_ID
AND A.ADDRESSTYPE IN('S','SB') 
AND A.STATUS='P' 
AND UR.STATUS='1' 
AND (UPPER(LOGONID) LIKE UPPER('%cn=users%') 
OR UPPER(LOGONID) LIKE UPPER('%o=Buyer A Organization%'))
AND UPPER(LOGONID) LIKE UPPER('uid=resourcereaper%')
AND rownum < 10; -- limits the rows back

本质上,LOGONID 字段包含用于登录的 LDAP 字符串。字段中的第一个字符是 uid=username,ou=......

我需要能够将该字段分解为“用户名”。我认为您可以使用 translate 命令,但我不确定如何修剪 uid= 和所有(包括)第一个“,”。任何见解将不胜感激。

  • 乔什
4

2 回答 2

2

像这样的东西:

substr(LOGONID,
       instr(LOGONID,'uid=')+4,
       instr(LOGONID,',')-instr(LOGONID,'uid=')-4
)

这依赖于这样一个事实,即它后面总是有 'uid=' 和一个逗号。如果不是这种情况,您还需要处理特殊情况。如果你想花哨的话,你也可以使用 REGEXP_SUBSTR() 。

于 2013-07-18T20:56:27.747 回答
2

翻译命令不是您想要的 - 进行字符替换。

您可以使用SUBSTR和的组合INSTR来获取用户名,但REGEXP_REPLACE更简洁一些(我当然认为)。这将为您提供uid价值:

REGEXP_REPLACE(LogonID, '^uid=(.*?),.*$', '\1')

我会更多地解释正则表达式(和\1),但我认为 Oracle 文档已经比我做得更好了。

另外,请注意WHERE ROWNUM < 10. ORDER BY它有时很古怪(或至少看起来如此),如果您在查询中,它根本不起作用。这里有更多信息和很好的解释。如果您遇到问题,ROWNUM可以通过放入ROWNUM外部查询来解决它:

SELECT * FROM (
  SELECT <your query>
) WHERE ROWNUM < 10
于 2013-07-18T20:57:12.343 回答