【问题标题】:Rails where word count in string column greater than?Rails 字符串列中的字数大于?
【发布时间】:2014-10-09 05:17:16
【问题描述】:

我需要根据某列中存在多少个单词来过滤记录。

以下工作,但当然返回字符数...我需要一个字数

 Flight.where("length(route) > 3")

有没有一种 Rails 方式(或任何方式)可以做到这一点?

这越来越近了(它就在 Rails 文档之外)但会导致错误

 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)

【问题讨论】:

    标签: postgresql ruby-on-rails-4


    【解决方案1】:

    Flight.where("array_length(route, 1) >= 3") 确实有效,但该列必须设置为数组类型。

    查看此帖子了解更多Rails Migration changing column to use Postgres arrays

    【讨论】:

    • 当引入数组列时,新版本的 PSQL 的完美答案。而不是在内存中操作数组,让 Db 服务器处理它。
    【解决方案2】:

    您可以使用 split 从字符串中创建一个数组,其中单词在字符串中以空格分隔并计算总数。

    Flight.select(:route).select { |flight| flight.route.split(" ").length > 3 }
    

    【讨论】:

    • 数据类型数组毕竟对我不起作用。我恢复到基本的字符串类型列。这是迄今为止最好的答案。
    【解决方案3】:

    假设您想将“单词”定义为“中间有空格的事物”,那么拆分字符串并获取结果数组的长度。

    在普通 SQL 中,应该是:

    SELECT array_length(string_to_array(route, ' '), 1);
    

    例如

    SELECT array_length(string_to_array('this is - five, words', ' '), 1);
    

    如果您想变得更漂亮并忽略标点符号等,请使用regexp_split_to_array。如果需要,您还可以查看使用 to_tsvector 创建词干和重复数据删除表单。

    【讨论】:

    • 感谢您的回答。我正在使用 ActiveRecord。 Postgres 提供了一个数组列类型,如果设置正确,它将提供 Flight.where("array_length(route, 1) >= 3")。我不知道我需要该列的类型为数组才能使其工作。
    猜你喜欢
    • 2013-10-09
    • 2023-03-21
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    相关资源
    最近更新 更多