我对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, '()', '/'), ' /', '/'), '/'));