Добавить заполнение к IP-адресам в PostgreSQL SELECT Query? - PullRequest
0 голосов
/ 04 октября 2019

У меня уже есть метод для Excel, но я хочу, чтобы заполнение выполнялось с помощью запроса, чтобы уменьшить мои усилия в дальнейшем

Пример Excel

=TEXT(LEFT(A2,FIND(".",A2,1)-1),"000") & "." & TEXT(MID(A2,FIND(
".",A2,1)+1,FIND(".",A2,FIND(".",A2,1)+1)-FIND(".",A2,1)-1),"000")
& "." & TEXT(MID(A2,FIND(".",A2,FIND(".",A2,1)+1)+1,FIND(".",A2,
FIND(".",A2,FIND(".",A2,1)+1)+1)-FIND(".",A2,FIND(".",A2,1)+1)-1),
"000") & "." & TEXT(RIGHT(A2,LEN(A2)-FIND(".",A2,FIND(".",A2,FIND(
".",A2,1)+1)+1)),"000")

Iпопытался найти документацию по PostgreSQL, но при конвертации в padded

ничего не было очевидно. Я также исследовал возможность выполнения CAST, как я делал для имен хостов с использованием regex

Пример имени хоста CAST для PostgreSQL

UPPER(regexp_replace(da.host_name, '([\.][\w\.]+)', '', 'g')) AS hostname

Но я здесь нахожусь на контрольно-пропускном пункте. Есть предложения?

1 Ответ

0 голосов
/ 04 октября 2019

Я делаю предположение, что, добавляя IP, вы хотите, чтобы lpad 0 был в передней части каждой части ip.

Используя regexp_replace, вы можете сделать следующее:

SELECT regexp_replace(regexp_replace('19.2.2.2', '([0-9]{1,3})', '00\1', 'g'), '(0*)([0-9]{3})', '\2', 'g');

По желанию, если вы используете 9.4 или новее, вы можете стать хитрым с UNNEST() или REGEXP_SPLIT_TO_TABLE() и новым ключевым словом WITH ORDINALITYразделить каждую часть ip (и ключ из таблицы) на собственную строку. Затем вы можете lpad() с 0 и string_agg() вернуть его вместе, используя порядковый номер, который был сохранен в unnest или regexp_split_to_table():

user=# SELECT * FROM test;
 id |      ip
----+--------------
  1 | 19.16.2.2
  2 | 20.321.123.1
(2 rows)

user=# SELECT id, string_agg(lpad(ip_part, 3, '0'),'.' ORDER BY rn) FROM test t, regexp_split_to_table(t.ip, '\.') WITH ORDINALITY s(ip_part, rn) GROUP BY id;
 id |   string_agg
----+-----------------
  1 | 019.016.002.002
  2 | 020.321.123.001
(2 rows)

Теоретически это будет работать в более старых версиях, так как кажется,как ординалы сохраняются во время unnest(), но это больше похоже на удачу, и я бы не стал создавать код, который зависит от этого.

...