我有一个表格形式的'queue'字符串字段:
"6.3, 6.2, 6.1"
即versions_required
列表 - 任何给定的行可以包含任何版本号集。
然后,我有一个列表,如:
versions_supported = "6.3, 6.2, 6.1" # Matches
# or
versions_supported = "6.3, 6.2" # Does not match (no 6.1)
# or
versions_supported = "6.4, 6.2, 6.1" # Does not match (6.4 instead of 6.3)
# or
versions_supported = "6.3, 6.2, 6.1, 5.9" # Matches
(此列表仅在我重新启动工作人员时更改)
我需要查找所有记录,以便每个必需的版本都在受支持的版本列表中;所有记录,以使所需版本的列表包含在支持的版本列表中。这就是我现在所拥有的:
Delayed::Job.first(10).select{|j| (j[:queue].split(',') - supported_versions).empty?}.first
但我真的想在查询中这样做。
我无法更改versions_required
字段的类型(它必须保留字符串) - 但我可以更改列表/字符串的格式但是我想要,包括以任何特定方式排序,或更改版本号转换为字符串的方式。
更大的上下文是我使用Rails和DelayedJob创建编码服务器,并且任何给定的作业可能需要多个不同版本的编码过程。由于我将有多台机器完成这项工作,每台机器都有自己的支持版本列表,我只是让每台机器只提取只需要它支持的版本的作业。
有什么想法吗?
答案 0 :(得分:3)
PostgreSQL只有一个数组运算符。
SELECT ARRAY['6.3', '6.2'] @> ARRAY['6.3', '6.2', '6.1']
请参阅:http://www.postgresql.org/docs/current/static/functions-array.html
如果您不能首先将字段存储为数组,则可以使用string_to_array
:
SELECT string_to_array('6.3, 6.2', ', ') @> string_to_array('6.3, 6.2, 6.1');