Postgres(或ActiveRecord) - 列表完全包含在另一个列表中

时间:2014-02-27 03:07:43

标签: ruby-on-rails postgresql activerecord

我有一个表格形式的'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创建编码服务器,并且任何给定的作业可能需要多个不同版本的编码过程。由于我将有多台机器完成这项工作,每台机器都有自己的支持版本列表,我只是让每台机器只提取只需要它支持的版本的作业。

有什么想法吗?

1 个答案:

答案 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');