4

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

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

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

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

我该怎么做呢?我尝试将数字转换为字符串,但这似乎也不起作用。

4

4 回答 4

12

基于 Erwin 的回答:
这是一个非常古老的问题,但如果有人需要,有一个非常简单的答案,使用::textcast:

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

这样,您可以在字符串中的任何位置找到数字。仅当您希望数字位于字符串末尾时,才在左侧
使用通配符。如果您希望数字位于字符串中的任何位置,也可以在右侧 使用通配符。%
%

于 2015-07-16T06:53:45.277 回答
8

简单案例

LIKE用于字符串/文本类型。由于您的主键是整数,因此您应该改用数学运算。

id当除以 100 时,使用模数得到余数。

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

这将返回Itemid列以88

1288
1488
1238872388
862388

ETC...

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

如果您要动态执行此操作(例如,匹配任意两位数,但您知道它始终是两位数),您可以执行以下操作:

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

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

Item.find_by_final_digits(2, 88)

匹配任意长度的最终数字范围

假设您想查找以 和 之间的数字结尾的所有值id无论出于何种原因。也许它们代表您正在查找的一些特殊范围的代码。为此,您可以执行另一种自定义方法来使用 Postgres查找范围。 0912BETWEEN

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)

...当然,这只是有点疯狂,而且可能矫枉过正。

于 2012-11-30T23:38:07.900 回答
5

LIKE运算符仅适用于字符串类型。
使用模运算符%来执行您要执行的操作:

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

我怀疑它在 SQLite 中“有效”,即使它将数字类型强制转换为字符串。没有引导%模式是行不通的。
-> sqlfiddle 演示

按您的预期投射text和使用任意长度:LIKE

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

或者,在数学上:

@item = Item.where("(id % 10^(length(?)) = ?", "'12345'", "12345").all
于 2012-11-30T23:36:18.183 回答
0

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

SELECT * FROM TABLE_NAME WHERE concat("id") LIKE '%ID%'
于 2020-04-24T12:27:44.990 回答