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