2015-08-30 5 views
0

Я довольно новичок в Rails/PostgreSQL и просто застрял в этой, казалось бы, простой проблеме.Сравните два столбца PostgreSQL со строками, разделенными символом «/» или «скобки»() «

Как сравнить строковые значения двух столбцов, когда один столбец содержит несколько строковых значений одной и той же вещи на разных языках, разделенных либо косой чертой «/», либо скобками «()»?

ID | Drink #1 |  Drink #2 
1 |  Water | Agua/Water/Eau 
2 | Magnesium | Magnesio (Magnesium) 

Я в первую очередь ищу запрос PostgreSQL для отображения в окне «Оба Пейте # 1 и пить # 2 содержит воду и магний», но я также интересен, если могут быть и другими способами, с помощью контроллера (C MVC). Я искал соответствующие Rails Gems, но не успел после многих часов.

Спасибо всем!

+0

Разве это не просто поиск подстроки? Найдите, есть ли напиток № 1 в напитке №2? – John

+0

Каков ваш ожидаемый результат. – HaveNoDisplayName

ответ

1

Просто проверить drink1 является ли подстрока drink2:

select * 
from drinks 
where drink2 like format('%%%s%%', drink1); 

id | drink1 |  drink2 
----+-----------+---------------------- 
    1 | Water  | Agua/Water/Eau 
    2 | Magnesium | Magnesio (Magnesium) 
(2 rows) 

Проверьте drink1 строго часть drink2 делится на /:

select * 
from drinks 
where drink1 = any(string_to_array(drink2, '/')); 

id | drink1 |  drink2 
----+--------+---------------- 
    1 | Water | Agua/Water/Eau 
(1 row) 

Проверьте drink2 содержит в скобках drink1:

select * 
from drinks 
where drink2 like format('%%(%s)%%', drink1); 

id | drink1 |  drink2 
----+-----------+---------------------- 
    2 | Magnesium | Magnesio (Magnesium) 
(1 row) 

запросов # 2 и # 3 в одном:

select * 
from drinks 
where drink1 = any(string_to_array(drink2, '/')) 
or drink2 like format('%%(%s)%%', drink1); 

id | drink1 |  drink2 
----+-----------+---------------------- 
    1 | Water  | Agua/Water/Eau 
    2 | Magnesium | Magnesio (Magnesium) 
(2 rows) 

Обновление 2015-09-02

У вас есть две формы синтаксиса в столбце drink2. Формы можно рассматривать как симметричные (с косой чертой) и асимметричные (с кронштейнами). Вы должны преобразовать асимметричный элементов в симметричный единиц. Вы можете использовать функции replace() and translate():

select *, replace(translate(drink2, '()', '/'), ' /', '/') 
from drinks 

id | drink1 |  drink2  |  replace 
----+-----------+----------------------+-------------------- 
    1 | Water  | Agua/Water/Eau  | Agua/Water/Eau 
    2 | Magnesium | Magnesio (Magnesium) | Magnesio/Magnesium 
(2 rows)  

и ваш запрос может выглядеть следующим образом:

select * 
from drinks 
where drink1 = any(string_to_array(replace(translate(drink2, '()', '/'), ' /', '/'), '/')); 
+0

Это работало как шарм - Спасибо! – sampbay

+0

На самом деле, еще один вопрос относительно скобок: что, если напиток 2 (второй столбец) содержит «Магний (магнезио)» - то есть значение строки, которое нужно сравнить, не находится внутри скобок? Я не уверен, что запрос подстроки может использоваться, поскольку такой запрос приведет к ложным срабатываниям в таких случаях, как «Сульфат магния», который не совпадает с «Магнием». – sampbay

+0

@sampbay - проверьте обновленный ответ. – klin

Смежные вопросы