Как отфильтровать varchar, содержащий номера сборки Android и IOS ниже определенной версии - PullRequest
0 голосов
/ 05 июля 2019

У меня есть таблица, в которой есть user_id и столбец os_version. Версия os представляет собой столбец varchar и содержит номера сборки, которые выглядят следующим образом

  • 4,3
  • 10.0.1

Я хочу попробовать выполнить фильтрацию по следующему запросу, но он не будет работать, поскольку эта логика фильтрации для строк не подходит.

SELECT
  user_id,
  os_version,
  CASE 
    WHEN os_version < '4.3' THEN TRUE 
    ELSE FALSE 
  END AS min_spec_bool
FROM table

Эта логика помечает значение 10.0.1 как < 4.3, что не является моим намерением. Я хочу сказать, что 10.0.1 должен быть помечен как False.

Как мне решить эту проблему?

1 Ответ

1 голос
/ 05 июля 2019

Вы должны преобразовать строку версии в числовую версию.

Это можно сделать, разбив строку на '.'и умножение каждого сечения на степени 10.

'4.3' можно преобразовать в '430'

Пример:

WITH mytable (user_id, os_version) AS (
SELECT 1, '4.3'::TEXT
UNION ALL
SELECT 2, '10.0.1'
UNION ALL
SELECT 3, '4.2'
)
SELECT
    user_id
  , os_version
  , CASE SPLIT_PART(os_version, '.', 1) WHEN '' THEN 0 ELSE SPLIT_PART(os_version, '.', 1)::INT END * 100
  + CASE SPLIT_PART(os_version, '.', 2) WHEN '' THEN 0 ELSE SPLIT_PART(os_version, '.', 2)::INT END * 10
  + CASE SPLIT_PART(os_version, '.', 3) WHEN '' THEN 0 ELSE SPLIT_PART(os_version, '.', 3)::INT END os_numeric
FROM mytable
WHERE (
    CASE SPLIT_PART(os_version, '.', 1) WHEN '' THEN 0 ELSE SPLIT_PART(os_version, '.', 1)::INT END * 100
  + CASE SPLIT_PART(os_version, '.', 2) WHEN '' THEN 0 ELSE SPLIT_PART(os_version, '.', 2)::INT END * 10
  + CASE SPLIT_PART(os_version, '.', 3) WHEN '' THEN 0 ELSE SPLIT_PART(os_version, '.', 3)::INT END
) < 430

Кроме того, обратите внимание, что если любой иззначения младших версий превышают 9, тогда вам придется выбирать разные множители.

...