如何选择管道分隔数据的前半部分

时间:2019-05-10 06:01:02

标签: sql oracle

名为REQUEST_IP_ADDR的列的每个记录中的数据如下'10 .247.32.44 | 10.247.32.44'。我如何只选择10.247.32.44的第一部分?

-以下是我要运行的选择查询

SELECT DISTINCT MSG_TYPE_CD, SRC, SRC_IP from MESSAGE_LOG order by MSG_TYPE_CD;

-我的表格如下所示

MSG_TYPE_CD   SRC              SRC_IP
KB0192        ZOHO         10.247.32.44 | 10.247.32.44
KB0192        ZOHO         10.247.32.45 | 10.247.32.45
KB0192        ZOHO         127.0.0.1 | 10.240.20.137
KB0192        ZOHO         127.0.0.1 | 10.240.20.138
KB0196        GUPSHUP          10.240.20.59 | 10.10.1.19

我只选择管道前的第一部分数据

1 个答案:

答案 0 :(得分:3)

使用基本字符串函数,我们可以尝试:

SELECT
    SRC_IP,
    SUBSTR(SRC_IP, 1, INSTR(SRC_IP, '|') - 2) AS first_ip
FROM MESSAGE_LOG
ORDER BY
    MSG_TYPE_CD;

enter image description here

Demo

第一个查询的逻辑是我们使用|找到管道INSTR的位置。然后,将子字符串从第一个字符开始,直到管道前的两个字符(以省略管道和管道前的空格)。

使用REGEXP_SUBSTR的答案很精巧:

SELECT
    SRC_IP,
    REGEXP_SUBSTR(SRC_IP, '^[^ |]+') AS first_ip
FROM MESSAGE_LOG
ORDER BY
    MSG_TYPE_CD;

Demo

这里使用的正则表达式模式是:

^[^ |]+

这表示从SRC_IP列的开头开始输入任何字符,而不是 空格管道|。这意味着使用第一个IP地址。