名为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
我只选择管道前的第一部分数据
答案 0 :(得分:3)
使用基本字符串函数,我们可以尝试:
SELECT
SRC_IP,
SUBSTR(SRC_IP, 1, INSTR(SRC_IP, '|') - 2) AS first_ip
FROM MESSAGE_LOG
ORDER BY
MSG_TYPE_CD;
第一个查询的逻辑是我们使用|
找到管道INSTR
的位置。然后,将子字符串从第一个字符开始,直到管道前的两个字符(以省略管道和管道前的空格)。
使用REGEXP_SUBSTR
的答案很精巧:
SELECT
SRC_IP,
REGEXP_SUBSTR(SRC_IP, '^[^ |]+') AS first_ip
FROM MESSAGE_LOG
ORDER BY
MSG_TYPE_CD;
这里使用的正则表达式模式是:
^[^ |]+
这表示从SRC_IP
列的开头开始输入任何字符,而不是 空格或管道|
。这意味着使用第一个IP地址。