请记住,我在这里分两个阶段构建查询。第一阶段是使用现有的查询效率很低。
我根本不熟悉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 =和所有(包括)第一个“,”。任何见解将不胜感激。
答案 0 :(得分:2)
这样的事情:
substr(LOGONID,
instr(LOGONID,'uid=')+4,
instr(LOGONID,',')-instr(LOGONID,'uid=')-4
)
这依赖于这样一个事实:在它之后总是有'uid ='和逗号。如果情况并非如此,您还需要处理特殊情况。如果你想要花哨,也可以使用REGEXP_SUBSTR()。
答案 1 :(得分:2)
translate命令不是您想要的 - 它可以进行逐字符替换。
您可以使用SUBSTR
和INSTR
的组合来获取用户名,但REGEXP_REPLACE
更清晰一点(我当然认为)。这将为您提供uid
值:
REGEXP_REPLACE(LogonID, '^uid=(.*?),.*$', '\1')
我会更多地解释正则表达式(以及\1
),但我认为Oracle文档已经做得比我做得好得多。
另外,请注意WHERE ROWNUM < 10
。它有时很古怪(或至少看起来如此),如果您在查询中ORDER BY
,它根本不起作用。有更多信息和很好的解释here。如果您遇到问题ROWNUM
,可以通过将ROWNUM
放入外部查询来解决问题:
SELECT * FROM (
SELECT <your query>
) WHERE ROWNUM < 10