我需要编写一个查询,查找一个可以小于、小于或等于、大于、大于或等于子句与正则表达式相结合的数字。是否有方法在查询中包含小于或大于子句,而不是重写regex?
我需要得到所有的答案,其中包含的数字小于或大于一个值,这取决于某些条件。
到目前为止我有这样的想法:
my_regex = "(^|;)([#{value}])($|;)"
Model.where("answer ~* ?", my_regex)这将返回包含该值的记录,但如果需要大于正则表达式的值,则不返回。
例如,如果我需要一个大于2的值:如果answer是"1;3;5;6;7;10",我想避免将regexp重写为“(^;)(#{ value }-9\10-9)($|;)”,这是可能的吗?
发布于 2018-01-17 01:48:29
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中的Ruby数组,而不会有任何额外的麻烦。
https://stackoverflow.com/questions/48291528
复制相似问题