Postgres(或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制作一个编码服务器,任何给定的作业都可能需要多个不同版本的编码过程。由于我将有多台机器来做这项工作,每台机器都有自己的支持版本列表,所以我只想让每台机器只提取只需要它支持的版本的作业。

有什么想法吗?

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

最新更新