Строка сравнения в Postgresql - PullRequest
0 голосов
/ 25 февраля 2020

Моя таблица:

CREATE TABLE public.software
(
    software_name text COLLATE pg_catalog."default",
    version text COLLATE pg_catalog."default", 
)

В этой таблице я храню программное обеспечение и его версии, которые я использую в некоторых проектах, и проверяю их обновления, сравнивая их версии. Мне нужно хранить информацию о версии в виде строки, потому что некоторые версии содержат строки, такие как «1.0.1-бета».

Я все еще не мог найти лучший способ сравнить строки. Я использую следующий (упрощенный) запрос:

    SELECT '1.2.3' < '1.2.4' -- true


    SELECT '1.2.3a' < '1.2.4B'

Когда я запускаю следующий запрос:

select '3.0.0' > '26752' -- true

select '1.2.3a' < '1.2.3A' -- true

select 'i dont know' >= '2' --true

Но 3.0.0 меньше, чем 26752. 1.2.3a (возможно) ложно, если я использую функцию lower (), я могу решить ее. Как насчет выберите '3.0.0'> '26752' или последний запрос?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Я установил расширение semver, которое прекрасно работает! спасибо @ арун

0 голосов
/ 25 февраля 2020

В общем, лучшим решением для этого является преобразование номеров версий в нечто числовое.

Лучшее, что я могу вам предложить, - это сортировка ICU для «естественного сравнения» (доступно с PostgreSQL v10 и далее) :

CREATE COLLATION en_natural (
   provider = icu,
   locale = 'en-US-u-kn-true'
);

ALTER TABLE public.software
   ALTER version TYPE text COLLATE en_natural;

Это приложит все усилия.

Конечно, 1.0.1 будет по-прежнему меньше 1.0.1-beta3, а также 1.0.1a, потому что есть нет встроенного знания, что «бета» меньше пустой строки, в то время как другие строки - нет.

...