首页 文章

Postgresql - 在字符变量列上获取MAX数值

提问于
浏览
-1

我在Postgresql表中有一个列是唯一的和字符变化(10)类型 . 该表包含我需要保留的旧字母数字值 . 每次从这一点开始创建一个新行时,我希望它只是数字 . 我想从此表中获取此列的max numeric-only值,然后创建一个新行,其最大值增加1 .

有没有办法只在此列中查询此表的最大数值?

例如,如果此列当前具有以下值:

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

是否有一个返回3333的查询,AKA从值中删除所有非数字字符,然后对它们执行MAX()?

2 回答

  • 0

    不完全是你提出的要求,但我认为对你有用的东西 .

    要遍历所有列,将每个列转换为数字,然后将其转换为整数并返回最大值:

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

    这会让你获得最大 Value ...比如说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;
    

    因为您只是设置默认值,所以不会更改当前的字母数字值 .

  • -1

    我想到了 . 以下查询有效 .

    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
    

相关问题