我对Rails/PostgreSQL还不太熟悉,只是遇到了这个看似简单的问题。
当一列包含同一事物的多个不同语言的字符串值时,如何比较两列的字符串值,这些值用斜线“/”或括号“()”分隔?

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

我主要是在寻找一个PostgreSQL查询,显示在“饮品1和饮品2都含有水和镁”的视图中,但我也想知道是否有其他方法可以使用控制器(MVC的C)。我搜索了相关的Rails宝石,但是经过很多小时都没有成功。
谢谢大家!

最佳答案

只需检查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是否严格地是adrink2除以/的一部分:
select *
from drinks
where drink1 = any(string_to_array(drink2, '/'));

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

检查括号中是否包含drink2
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
drink1列中有两种语法形式。
这些形式可以看作是对称的(带斜杠)和非对称的(带括号)。
您应该将非对称项转换为对称项。
您可以使用函数drink2 and replace()
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, '()', '/'), ' /', '/'), '/'));

10-07 21:17