Postgresql - получить МАКС. Числовое значение в столбце с переменными символами - PullRequest
0 голосов
/ 27 июня 2018

У меня есть столбец в таблице Postgresql, который является уникальным и имеет символьный (10) тип. Таблица содержит старые буквенно-цифровые значения, которые мне нужно сохранить. Каждый раз, когда с этой точки создается новая строка, я хочу, чтобы она была только числовой. Я хотел бы получить максимальное числовое значение из этой таблицы для этого столбца, а затем создать новую строку с максимальным значением, увеличенным на 1.

Есть ли способ запросить в этой таблице максимальное числовое значение только для этого столбца?

Например, если этот столбец в настоящее время имеет значения:

1111
A1111A
1234
1234A
3331
B3332
C-3333
33-D33
3**333*

Есть ли запрос, который возвратит 3333, AKA вырезает все нечисловые символы из значений и затем выполняет MAX () для них?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Не совсем то, что вы спрашиваете, но то, что я думаю, будет работать лучше для вас.

Чтобы пройтись по всем столбцам, преобразуйте каждый в число, а затем приведите его к целому числу и верните max.:

SELECT MAX(regexp_replace(my_column, '[^0-9]', '', 'g')::int) FROM public.foobar;

Это дает вам максимальное значение ... скажем, 2999.

Теперь, продвигаясь вперед, рассмотрите возможность сделать значение по умолчанию для вашего столбца последовательным значением и преобразовать его в текст ... таким образом, вы один раз установили "MAX", а затем позволили postgres сделать всю работу для будущих значений. .

-- create simple integer sequence
CREATE SEQUENCE public.foobar_my_column_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 0;

-- use new sequence as default value for column __and__ convert to text
ALTER TABLE foobar 
  ALTER COLUMN my_column 
    SET DEFAULT nextval('publc.foobar_my_column_seq'::regclass)::text;

-- initialize "next value" of sequence to whatever is larger than
-- what you already have in your data ... say 3000:
ALTER SEQUENCE public.foobar_my_column_seq RESTART WITH 3000;

Поскольку вы просто устанавливаете значение по умолчанию, вы не меняете свои текущие буквенно-цифровые значения.

0 голосов
/ 27 июня 2018

Я понял это. Следующий запрос работает.

select text_value, regexp_replace(text_value, '[^0-9]+', '') as new_value from the_table;

Результат:

 text_value            | new_value
-----------------------+-------------
 4*215474              | 4215474
 740024                | 740024
 4*100535              | 4100535
 42356                 | 42356
 CASH                  | 
 4*215474              | 4215474
 740025                | 740025
 740026                | 740026
 4*5089655798          | 45089655798
 4*15680               | 415680
 4*224034              | 4224034
 4*265718708           | 4265718708
...