我需要编写一个查询,找到一个可以小于,小于或等于,大于,大于或等于与正则表达式结合的子句的数字。 有没有办法在查询中包含小于或大于子句,而不是重写正则表达式?
我需要根据特定条件获得包含小于或大于某个数字的所有答案。
到目前为止,我有这个:
my_regex = "(^|;)([#{value}])($|;)"
Model.where("answer ~* ?", my_regex)
这将返回包含值的记录,但如果我需要大于正则表达式的值,则不会返回。
例如,如果我需要大于2的值:
如果answer
是"1;3;5;6;7;10"
,我希望避免将正则表达式重写为"(^ |;)([#{value} -9] | 1 [0-9])($ | ;)"那可能吗?
答案 0 :(得分:1)
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数组,而不会有任何额外的问题。