Запрос числовых и текстовых значений в текстовом поле PostgreSQL

Mysql выполняет запрос в текстовом поле по цифровым (больше и меньше) и текстовым значениям. Как сделать такое же в PostgreSQL?

Есть информация в столбце OFFER:

0,58 
10,07 
1,4 
240 
0,21 не обнаружены
5,5 
71,6 
 Отрицательно
 Отрицательно
 Отрицательно
0 
 Отрицательно
0 
 Следы
0,5 
 Отрицательно
 Отрицательно
1,015 
 Полная
76,9 
0 
 Норма

Вот запрос SQL работающий на MySQL

select analiz.oms, analiz.test, analiz.offer, analiz.date_rezult 
FROM analiz 
left JOIN prikrc on analiz.oms = prikrc.oms
WHERE 
 (
(test LIKE 'ca 125%' AND offer > 35)
   OR (test LIKE 'eos' AND offer > 1)
   OR (test LIKE 'HbA1c' AND offer > 10)
   OR (test LIKE 'LYM' AND (offer < 1 OR offer > 8) and  offer not LIKE '%сгустки %')
   OR (test LIKE 'NEU' AND (offer < 1 OR offer > 15) and  offer not LIKE '%сгустки %')
   OR (test LIKE 'HGB' AND (offer < 105 or offer > 190) and  offer not LIKE '%сгустки%')
   OR (test LIKE 'plt' AND (offer < 50 OR offer > 750) and  offer not LIKE '%сгустки %')
   OR (test LIKE 'RPR Treponema pallidum' AND offer LIKE 'Положительный')
   OR (test LIKE 'WBC' AND (offer < 3 OR offer > 15) and  offer not LIKE '%сгустки %')
   OR (test LIKE 'Аланинаминотрасфераза (Алат)' AND offer > 120)

Я пробовал сделать данный запрос через Python Данный запрос не выполняется Прошу подсказать как можно решить данный вопрос на Postgresql или PYthon (может какой нибудь библиотекой)


Ответы (1 шт):

Автор решения: ValNik

Лучше, конечно, в базе выделить цифровое значение в отдельную колонку.
Например (0.21,'Не обнаружено')

В текущем виде можно попробовать так

select *
  ,case when regexp_instr(split_part(trim(offer),' ',1),'[^ 0123456789,.]')=0
    then cast(replace('0'||split_part(trim(offer),' ',1),',','.') as float)
   else 0 end offerV
from analiz

То есть, Ваш запрос может выглядеть так

select analiz.oms, analiz.test, analiz.offer, analiz.date_rezult 
FROM (
  select *
    ,case when regexp_instr(split_part(trim(offer),' ',1),'[^ 0123456789,.]')=0
       then cast(replace('0'||split_part(trim(offer),' ',1),',','.') as float)
     else 0 end offerV
     from analiz
    ) analiz 
left JOIN prikrc on analiz.oms = prikrc.oms
WHERE 
 (
(test LIKE 'ca 125%' AND offerV > 35)
   OR (test LIKE 'eos' AND offerV > 1)
   OR (test LIKE 'HbA1c' AND offerV > 10)
   OR (test LIKE 'LYM' AND (offerV < 1 OR offerV > 8) and  offer not LIKE '%сгустки %')
   OR (test LIKE 'NEU' AND (offerV < 1 OR offerV > 15) and  offer not LIKE '%сгустки %')
   OR (test LIKE 'HGB' AND (offerV < 105 or offerV > 190) and  offer not LIKE '%сгустки%')
   OR (test LIKE 'plt' AND (offerV < 50 OR offerV > 750) and  offer not LIKE '%сгустки %')
   OR (test LIKE 'RPR Treponema pallidum' AND offer LIKE 'Положительный')
   OR (test LIKE 'WBC' AND (offerV < 3 OR offerV > 15) and  offer not LIKE '%сгустки %')
   OR (test LIKE 'Аланинаминотрасфераза (Алат)' AND offerV > 120)
→ Ссылка