2013-07-18 62 views
1

请记住,我在这里分两个阶段构建查询。第一个阶段是让这个工作与效率低下的现有查询一起工作。需要帮助翻译Oracle查询中返回的数据

我并不擅长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 = ......

我需要能够将该字段雕刻为仅仅是“用户名”。我认为你可以使用翻译命令,但我不确定如何修剪uid =和所有内容(包括)第一个“,”。任何有识之士将不胜感激。

  • 乔希

回答

2

翻译命令不是你想要的 - 这是一个字符替换字符。

您可以使用SUBSTRINSTR组合来获取用户名,但REGEXP_REPLACE是干净了一点(当然我的看法)。这会给你的uid值:

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

我想解释的正则表达式(和\1)多,但我觉得比我在Oracle文档已经做了更好的工作。请注意0​​。有时古怪(或至少看起来如此),并且如果你在查询中使用ORDER BY,它根本不起作用。有更多的信息和一个很好的解释here。如果遇到与ROWNUM麻烦你可以通过把ROWNUM到外部查询修复:

SELECT * FROM (
    SELECT <your query> 
) WHERE ROWNUM < 10 
+0

你先生是个绅士和学者,非常感谢你!它工作完美,正是我所期待的! +1关注ROWNUM警告! – ResourceReaper

2

事情是这样的:

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

这依赖于一个事实,即总有 'UID =' 之后某个地方,这一个逗号。如果情况并非如此,则还需要处理特殊情况。你也可以使用REGEXP_SUBSTR()如果你想要看中。

+0

这是不错的,但我认为使用REGEXP_REPLACE实际上是更清洁。 – ResourceReaper