如果我有一个数字(比如88),并且我想在Rails中对主ID列执行LIKE查询,以返回在ID末尾包含该数字的所有记录(即:#28888;,我该怎么做?下面是生成结果的代码,它在SQLLite中运行良好:
@item = Item.where("id like ?", "88").all
在PostgreSQL中,我遇到了这个错误:
PG::Error: ERROR: operator does not exist: integer ~~ unknown
我该怎么做?我试着把数字转换成字符串,但似乎也不起作用。
4条答案
按热度按时间nnsrf1az1#
根据靳泽的回答:
这是一个非常古老的问题,但如果有人需要它,有一个非常简单的答案,使用
::text
转换:这样,你就可以在字符串中的任何地方找到数字。
只有当你想让数字位于字符串的末尾时,才使用
%
向左。如果你想让数字在字符串中的任何位置,也可以在右边使用
%
。hm2xizp92#
简单案例
LIKE
用于字符串/文本类型。因为你的主键是一个整数,所以你应该使用一个数学运算。使用模运算得到
id
值除以100后的余数。这将返回
id
列以88
结尾的Item
记录等等
匹配任意一组最后两位数字
如果你打算动态地做这件事(例如,匹配任意一组两位数,但你知道它总是两位数),你可以这样做:
匹配任意组或任意数量的最后数字
如果你想匹配任意数量的数字,只要它们总是最后的数字(而不是出现在
id
字段中的其他地方的数字),你可以在你的模型上添加一个自定义方法。例如:使用此方法,您可以找到以
88
结尾的id
值,其中:匹配任意长度的最后一位数范围
假设您想查找所有以**
09
和12
之间的数字**结尾的id
值,无论出于何种原因。也许它们代表了你要查的某种特殊的代码。要做到这一点,你可以做另一个自定义方法,使用Postgres的BETWEEN
来查找范围。.可以使用以下命令调用:
……当然,这一切都有点疯狂,而且可能有点过头了。
eni9jsuy3#
LIKE
运算符仅适用于字符串类型。使用modulo operator
%
来执行您尝试执行的操作:我怀疑它在SQLite中是否“有效”,即使它将数值类型强制转换为字符串。如果没有前导
%
,模式就无法工作。fiddle
老麻雀
强制转换为
text
并使用LIKE
作为您想要的 * 任意 * 长度:或者,数学上:
aelbi1ox4#
LIKE运算符不适用于数字类型,而id是数字类型,因此您可以将其与concat一起使用