【问题标题】:extract substring from mysql column using regex使用正则表达式从 mysql 列中提取子字符串
【发布时间】:2017-07-18 22:37:38
【问题描述】:

我的正则表达式是

(pnr|(P|p)[ _.:,!"'-/$](N|n)[ _.:,!"'-/$](R|r))+[ _.:,!"'-/$]+[0-9]{3}[ _.:,!"'-/$]+[0-9]{7}

它正在从列中提取 pnr 编号。

示例文本:

94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding pnr:986-097832

94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: pnr:986-097832 text/plain; charset=UTF-8\r\nContent-Transfer-Encoding 

pnr:986-097832 94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding

我必须创建一个只提取 pnr 号码的 mysql 查询

【问题讨论】:

    标签: mysql regex substring


    【解决方案1】:
    SELECT REGEXP_SUBSTR(column, 'pnr:[0-9\-]{10}')
    FROM table
    

    【讨论】:

    • 欢迎来到 Stack Overflow!感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
    • 简洁明了。
    • REGEXP_SUBSTR 仅适用于 MySQL >= 8.0 !
    【解决方案2】:

    试试 SUBSTRING_INDEX

    SELECT 
    SUBSTRING_INDEX(
    SUBSTRING_INDEX('94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding pnr:986-097832', 'pnr:', -1), ' ',1);
    
    SELECT 
    SUBSTRING_INDEX(
    SUBSTRING_INDEX('94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: pnr:986-097832 text/plain; charset=UTF-8\r\nContent-Transfer-Encoding', 'pnr:', -1), ' ',1);
    
    SELECT 
    SUBSTRING_INDEX(
    SUBSTRING_INDEX('pnr:986-097832 94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding', 'pnr:', -1), ' ',1);
    

    样本

    mysql> SELECT
        -> SUBSTRING_INDEX(
        -> SUBSTRING_INDEX('94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: pnr:986-097832 text/plain; charset=UTF-8\r\nContent-Transfer-Encoding', 'pnr:', -1), ' ',1);
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | SUBSTRING_INDEX(
    SUBSTRING_INDEX('94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: pnr:986-097832 text/plain; charset=UTF-8\r\nContent-Transfer-Encoding', 'pnr:', -1), ' ',1) |
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | 986-097832                                                                                                                                                                  |
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0,00 sec)
    
    mysql>
    mysql> SELECT
        -> SUBSTRING_INDEX(
        -> SUBSTRING_INDEX('pnr:986-097832 94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding', 'pnr:', -1), ' ',1);
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | SUBSTRING_INDEX(
    SUBSTRING_INDEX('pnr:986-097832 94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding', 'pnr:', -1), ' ',1) |
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | 986-097832                                                                                                                                                                  |
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0,00 sec)
    
    mysql>
    

    【讨论】:

    • 我正在尝试使用 substring_index 但我必须将它与正则表达式一起使用,因为 pnr 可以是 p:n:r 或 PNR 或 p.n.r : 123-3123212
    • @Sunil Harak - 您可以尝试像这样规范化“pnr”并将其放入我的查询中 SELECT REPLACE( REPLACE( REPLACE('pnr:986-097832 94eb2c0cb17ef354bb052c57f40c\r\nContent-类型:text/plain; charset=UTF-8\r\nContent-Transfer-Encoding' ,'p:n:r','PNR') ,'pnr','PNR') ,'pnr','PNR ');
    • @Sunil Harak - 或者如果您使用 MariaDB,您可以直接使用 REGEXP_SUBSTR 参见:mariadb.com/kb/en/mariadb/regexp_substr
    • 适用于旧版本的 Mysql(对我来说是 5.0.x) 某些用户可能会寻找什么! (因为旧文档不再在线)
    • 这里是给老杜库的dev.mysql.com/doc/index-archive.html
    【解决方案3】:

    对于 Oracle,我们可以执行以下操作 -

        SQL> create table test2( id varchar2(2000));
    
        Table created.
    
        SQL> insert into test2 values ('pnr:986-097831 94eb2c0cb17ef354bb052c57f40c\r\nC
        ontent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding');
    
        1 row created.
    
        SQL> insert into test2 values('94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: pnr
        :986-097832 text/plain; charset=UTF-8\r\nContent-Transfer-Encoding')
          2  ;
    
        1 row created.
    
        SQL> insert into test2 values('94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: tex
        t/plain; charset=UTF-8\r\nContent-Transfer-Encoding pnr:986-097833');
    
        1 row created.
    
        SQL> select regexp_substr( id, '(P|p)(N|n)(R|r):[0-9]*\-[0-9]*' ) PNR FROM  test2;
    
        PNR
    ----------------
    
    pnr:986-097831
    pnr:986-097832
    pnr:986-097833
    
        SQL>
    
    `
    

    【讨论】:

    • 感谢您的回复:),但我想要它用于 mysql
    猜你喜欢
    • 2017-01-09
    • 2010-10-14
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多