Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL:在SELECT语句中使用Substr_Sql_Oracle - Fatal编程技术网

Oracle SQL:在SELECT语句中使用Substr

Oracle SQL:在SELECT语句中使用Substr,sql,oracle,Sql,Oracle,在SELECT语句中,是否可以使用CASE计算Substr?或者,根据条件返回子字符串的最佳方式是什么 我试图从表的事件描述列中检索名称。事件描述列中的字符串的格式类似于文本Mike Smith文本或文本Joe Schmit Manager文本。我只想返回名称,但将一些名称后跟Manager会使我的SELECT语句失效 这是我的SELECT语句: SELECT * FROM ( SELECT Substr(Substr(eventdes,Instr(eventdes,'(')+1),1,

在SELECT语句中,是否可以使用CASE计算Substr?或者,根据条件返回子字符串的最佳方式是什么

我试图从表的事件描述列中检索名称。事件描述列中的字符串的格式类似于文本Mike Smith文本或文本Joe Schmit Manager文本。我只想返回名称,但将一些名称后跟Manager会使我的SELECT语句失效

这是我的SELECT语句:

 SELECT *
 FROM (
 SELECT Substr(Substr(eventdes,Instr(eventdes,'(')+1),1,
    Instr(eventdes,')') - Instr(eventdes,'(')-1)
   FROM mytable
      WHERE admintype = 'admin'
    AND entrytime BETWEEN sysdate - (5/(24*60)) AND sysdate
    AND eventdes LIKE '%action taken by%'
     ORDER BY id DESC
     )
 WHERE ROWNUM <=1
如果没有经理,则返回类似于迈克·史密斯的内容;如果有经理,则返回类似于乔·施密特的内容


非常感谢您的帮助。

您可以使用INSTR搜索最后一个,但我更喜欢正则表达式

这将提取第一个和最后一个之间的所有内容,并删除Oracle不支持在RegEx中查找的括号:

RTRIM(LTRIM(REGEXP_SUBSTR(eventdes, '\(.*\)'), '('), ')')

您可以使用INSTR搜索最后一个,但我更喜欢正则表达式

这将提取第一个和最后一个之间的所有内容,并删除Oracle不支持在RegEx中查找的括号:

RTRIM(LTRIM(REGEXP_SUBSTR(eventdes, '\(.*\)'), '('), ')')

可能有一个regex不需要替换就可以做到这一点,但我不够聪明,无法解决这个问题,所以我结合了一个REGEXP_子字符串来替换您的多个instr方法和一个REGEXP_替换来替换“MANAGER”部分,如果它存在的话

SELECT *
FROM (
    SELECT REGEXP_REPLACE(
        REGEXP_SUBSTR(eventdes, '\((.*)\)', 1, 1, 'i', 1), ' \(MANAGER\)', '')
    FROM mytable
    WHERE admintype = 'admin'
    AND entrytime BETWEEN sysdate - (5/(24*60)) AND sysdate
    AND eventdes LIKE '%action taken by%'
    ORDER BY id DESC
 )
WHERE ROWNUM <=1

可能有一个regex不需要替换就可以做到这一点,但我不够聪明,无法解决这个问题,所以我结合了一个REGEXP_子字符串来替换您的多个instr方法和一个REGEXP_替换来替换“MANAGER”部分,如果它存在的话

SELECT *
FROM (
    SELECT REGEXP_REPLACE(
        REGEXP_SUBSTR(eventdes, '\((.*)\)', 1, 1, 'i', 1), ' \(MANAGER\)', '')
    FROM mytable
    WHERE admintype = 'admin'
    AND entrytime BETWEEN sysdate - (5/(24*60)) AND sysdate
    AND eventdes LIKE '%action taken by%'
    ORDER BY id DESC
 )
WHERE ROWNUM <=1
Oracle 11g R2架构设置:

问题1:

编辑:

Oracle 11g R2架构设置:

问题1:

Oracle 11g R2架构设置:

问题1:

编辑:

Oracle 11g R2架构设置:

问题1:


对于这个问题,这里有一个稍微不同的看法。此regexp从第一个打开参数+1(名称的第一个字母)的位置开始,然后返回从字符串中该点开始的第一个组,该组由1个或多个非关闭参数或打开参数的字符组成。如果有管理器,修剪将去掉尾随空间

SQL> with tbl(id, admintype, entrytime, eventdes ) AS
  2  ( SELECT 1, 'admin', SYSDATE, 'action taken by (John Doe (Manager)) more text' FROM DUAL
  3    union
  4    SELECT 1, 'admin', SYSDATE, 'action taken by (Jane Doe) more text' FROM DUAL
  5  )
  6  select trim(regexp_substr(eventdes, '([^\)\(]+)', instr(eventdes, '(')+1, 1)) name
  7  from tbl;

NAME
----------------------------------------------
Jane Doe
John Doe

SQL>

对于这个问题,这里有一个稍微不同的看法。此regexp从第一个打开参数+1(名称的第一个字母)的位置开始,然后返回从字符串中该点开始的第一个组,该组由1个或多个非关闭参数或打开参数的字符组成。如果有管理器,修剪将去掉尾随空间

SQL> with tbl(id, admintype, entrytime, eventdes ) AS
  2  ( SELECT 1, 'admin', SYSDATE, 'action taken by (John Doe (Manager)) more text' FROM DUAL
  3    union
  4    SELECT 1, 'admin', SYSDATE, 'action taken by (Jane Doe) more text' FROM DUAL
  5  )
  6  select trim(regexp_substr(eventdes, '([^\)\(]+)', instr(eventdes, '(')+1, 1)) name
  7  from tbl;

NAME
----------------------------------------------
Jane Doe
John Doe

SQL>

这将从第一个示例字符串返回johndoe[Manager]。当我阅读问题时,他想要的只是John Doe。或者,如果方括号不在那里,它将返回John Doe Manager,这与问题的其余部分不清楚。这将从第一个示例字符串返回John Doe[Manager]。我读到问题时,他想要的只是John Doe。或者,如果方括号不在那里,那么它会返回John Doe Manager,这与问题的其余部分不清楚。在你第二段中的John Doe示例中,方括号应该在那里吗?不,它们表示该领域中可能存在或可能不存在的内容。我编辑我的帖子是为了更清楚地说明这一点。在你第二段中的John Doe样本中,方括号应该在那里吗?不,它们是用来表示字段中可能存在或可能不存在的内容。我编辑我的帖子是为了让这一点更清楚。如果你不介意的话,如果所有的名字都以姓氏开头,姓氏后面没有逗号,而你想把它们翻过来,让名字排在第一位,那么你的方法是什么?@Walter41添加了一个带有两种不同解决方案的编辑。如果你总是使用逗号,那么我会使用SUBSTR和INSTR,因为它可能更有效。但是如果逗号格式是可选的,那么REGEXP_REPLACE可能更好。如果你不介意,如果所有的名字都以姓氏开头,姓氏后面没有逗号,你想把它们翻过来,让名字排在前面吗?@Walter41添加了一个带有两种不同解决方案的编辑。如果您总是使用逗号,那么我会使用SUBSTR和INSTR,因为它可能更有效,但是如果逗号格式是可选的,那么REGEXP_REPLACE可能更好。
SELECT SUBSTR( Name, INSTR( Name, ',' ) + 1 ) || ' ' || SUBSTR( Name, 1, INSTR( Name, ',' ) - 1 ) AS Full_Name,
       REGEXP_REPLACE( Name, '^(.*?),\s*(.*)$', '\2 \1' ) AS Full_Name2
FROM ( SELECT REGEXP_SUBSTR( eventdes, '\((.*?)(\s*\(.*?\))?\)', 1, 1, 'i', 1 ) AS Name
       FROM   mytable
       WHERE  admintype = 'admin'
--       AND    entrytime BETWEEN sysdate - (5/(24*60)) AND sysdate
       AND    eventdes LIKE '%action taken by%'
       ORDER BY id DESC
     )
WHERE ROWNUM <=1
| FULL_NAME | FULL_NAME2 |
|-----------|------------|
|  John Doe |   John Doe |
SQL> with tbl(id, admintype, entrytime, eventdes ) AS
  2  ( SELECT 1, 'admin', SYSDATE, 'action taken by (John Doe (Manager)) more text' FROM DUAL
  3    union
  4    SELECT 1, 'admin', SYSDATE, 'action taken by (Jane Doe) more text' FROM DUAL
  5  )
  6  select trim(regexp_substr(eventdes, '([^\)\(]+)', instr(eventdes, '(')+1, 1)) name
  7  from tbl;

NAME
----------------------------------------------
Jane Doe
John Doe

SQL>