比较两个 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, '()', '/'), ' /', '/'), '/'));
我是 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, '()', '/'), ' /', '/'), '/'));