在 where 中使用小于或大于 where 子句,并在 rails 中使用正则表达式



我需要编写一个查询来查找一个可以小于、小于或等于、大于、大于或等于子句的数字,并结合正则表达式。有没有办法在查询中包含小于或大于子句,而不是重写正则表达式?

我需要根据某些条件获得包含小于或大于值的数字的所有答案。

到目前为止,我有这个:

my_regex = "(^|;)([#{value}])($|;)"
Model.where("answer ~* ?", my_regex)

这将返回包含该值的记录,但如果我需要大于正则表达式的值,则不会返回。

例如,如果我需要一个大于 2 的值:如果answer "1;3;5;6;7;10"我想避免将正则表达式重写为"(^|;)([#{value}-9]|1[0-9](($|;)"这可能吗?

您的answer列的格式很不幸,但并非没有希望。您当前使用的~*运算符告诉我这是PostgreSQL,因此您可以将answer解压缩到SQL数组中:

regexp_split_to_array(answer, ';')::int[]

然后使用any查找所需的值:

...where("? < any(regexp_split_to_array(answer, ';')::int[])", 2)

::int[] 是一种类型转换,用于将regexp_split_to_array为您提供的字符串数组转换为要进行比较的数字。然后检查是否有任何数组元素大于 2。


您还可以将answer列的格式更改为实际的整数数组,并说更简单:

...where('? < any(answer)', 2)

ActiveRecord也知道如何使用PostgreSQL数组,所以model.answer Rails-land中将是一个Ruby数组,没有任何额外的麻烦。

相关内容

最新更新