ruby 如何在PostgreSQL主id列上执行LIKE查询?

to94eoyn  于 12个月前  发布在  Ruby
关注(0)|答案(4)|浏览(117)

如果我有一个数字(比如88),并且我想在Rails中对主ID列执行LIKE查询,以返回在ID末尾包含该数字的所有记录(即:#28888;,我该怎么做?下面是生成结果的代码,它在SQLLite中运行良好:

@item = Item.where("id like ?", "88").all

在PostgreSQL中,我遇到了这个错误:

PG::Error: ERROR:  operator does not exist: integer ~~ unknown

我该怎么做?我试着把数字转换成字符串,但似乎也不起作用。

nnsrf1az

nnsrf1az1#

根据靳泽的回答:
这是一个非常古老的问题,但如果有人需要它,有一个非常简单的答案,使用::text转换:

Item.where("(id::text LIKE ?)", "%#{numeric_variable}").all

这样,你就可以在字符串中的任何地方找到数字。
只有当你想让数字位于字符串的末尾时,才使用%向左。
如果你想让数字在字符串中的任何位置,也可以在右边使用%

hm2xizp9

hm2xizp92#

简单案例

LIKE用于字符串/文本类型。因为你的主键是一个整数,所以你应该使用一个数学运算。
使用模运算得到id值除以100后的余数。

Item.where("id % 100 = 88")

这将返回id列以88结尾的Item记录

1288
1488
1238872388
862388

等等

匹配任意一组最后两位数字

如果你打算动态地做这件事(例如,匹配任意一组两位数,但你知道它总是两位数),你可以这样做:

Item.where(["id % 100 = ?", last_two_digits)

匹配任意组或任意数量的最后数字

如果你想匹配任意数量的数字,只要它们总是最后的数字(而不是出现在id字段中的其他地方的数字),你可以在你的模型上添加一个自定义方法。例如:

class Item < ActiveRecord

  ...

  def find_by_final_digits(num_digits, digit_pattern)
    # Where 'num_digits' is the number of final digits to match
    # and `digit_pattern` is the set of final digits you're looking fo

    Item.where(["id % ? = ?", 10**num_digits, digit_pattern])
  end

  ...

end

使用此方法,您可以找到以88结尾的id值,其中:

Item.find_by_final_digits(2, 88)

匹配任意长度的最后一位数范围

假设您想查找所有以**0912之间的数字**结尾的id值,无论出于何种原因。也许它们代表了你要查的某种特殊的代码。要做到这一点,你可以做另一个自定义方法,使用Postgres的BETWEEN来查找范围。

def find_by_final_digit_range(num_digits, start_of_range, end_of_range)
  Item.where(["id % ? BETWEEN ? AND ?", 10**num_digits, start_of_range, end_of_range)
end

.可以使用以下命令调用:

Item.find_by_final_digit_range(2, 9, 12)

……当然,这一切都有点疯狂,而且可能有点过头了。

eni9jsuy

eni9jsuy3#

LIKE运算符仅适用于字符串类型。
使用modulo operator %来执行您尝试执行的操作:

@item = Item.where("(id % 100) = ?", "88").all

我怀疑它在SQLite中是否“有效”,即使它将数值类型强制转换为字符串。如果没有前导%,模式就无法工作。
fiddle
老麻雀
强制转换为text并使用LIKE作为您想要的 * 任意 * 长度:

@item = Item.where("(id::text LIKE ('%'::text || ?)", "'12345'").all

或者,数学上:

@item = Item.where("(id % 10^(length(?)) = ?", "'12345'", "12345").all
aelbi1ox

aelbi1ox4#

LIKE运算符不适用于数字类型,而id是数字类型,因此您可以将其与concat一起使用

SELECT * FROM TABLE_NAME WHERE concat("id") LIKE '%ID%'

相关问题