Запрос числовых и текстовых значений в текстовом поле 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)