比较两个 PostgreSQL 列,字符串由斜杠“/”或圆括号“( )”分隔

Compare two PostgreSQL columns with strings separated by slash "/" or parentheses "( )"

我是 Rails/PostgreSQL 的新手,只是被这个看似简单的问题困住了。

当一列包含不同语言的同一事物的多个字符串值时,如何比较两列的字符串值,这些字符串值由斜杠“/”或圆括号“( )”分隔?

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

我主要是在寻找要在视图中显示的 PostgreSQL 查询 "Both Drink #1 and Drink #2 contain Water and Magnesium",但我也想知道是否有其他方法可以使用控制器(MVC 的 C)。我搜索了相关的 Rails Gems,但几个小时后都没有成功。

谢谢大家!

简单检查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 列中有两种语法形式。 形式可以被视为 symmetric(带斜线)和 asymmetric(带括号)。 您应该将 非对称 项目转换为 对称 项目。 您可以使用函数 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, '()', '/'), ' /', '/'), '/'));