需要帮助翻译Oracle查询中返回的数据

时间:2013-07-18 20:10:23

标签: oracle replace translate

请记住,我在这里分两个阶段构建查询。第一阶段是使用现有的查询效率很低。

我根本不熟悉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 =和所有(包括)第一个“,”。任何见解将不胜感激。

  • 约什

2 个答案:

答案 0 :(得分:2)

这样的事情:

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

这依赖于这样一个事实:在它之后总是有'uid ='和逗号。如果情况并非如此,您还需要处理特殊情况。如果你想要花哨,也可以使用REGEXP_SUBSTR()。

答案 1 :(得分:2)

translate命令不是您想要的 - 它可以进行逐字符替换。

您可以使用SUBSTRINSTR的组合来获取用户名,但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