我需要根据某列中存在多少个单词来过滤记录。
以下作品,但当然会返回一个字符数...我需要一个字数
Flight.where("length(route) > 3")
这样做是否有轨道(或任何方式)?
这种情况越来越近了(它正好在rails docs之外),但却导致错误
Flight.where("array_length(route, 1) >= 3")
ERROR: aggregate functions are not allowed in WHERE
ERROR: function array_length(character varying, integer) does not exist
文档还建议使用HAVING ..也无效
Flight.having("route.count > ?", 2)
答案 0 :(得分:1)
您可以使用split从字符串创建一个数组,其中的字符串用字符串中的空格分隔并计算总数。
Flight.select(:route).select { |flight| flight.route.split(" ").length > 3 }
答案 1 :(得分:0)
假设你想要一个天真的“单词”定义为“中间有空格的东西”,拆分字符串并得到结果数组的长度。
在纯SQL中,那就是:
SELECT array_length(string_to_array(route, ' '), 1);
e.g。
SELECT array_length(string_to_array('this is - five, words', ' '), 1);
如果您想获得更高级并忽略标点符号等,请使用regexp_split_to_array
。如果需要,您还可以使用to_tsvector
创建一个词干和去重复的表单。
答案 2 :(得分:0)
Flight.where(“array_length(route,1)> = 3”)确实有效,但该列必须设置为类型数组。
请参阅此帖子了解更多Rails Migration changing column to use Postgres arrays