在整数列上使用 Like 运算符进行过滤

Posted

技术标签:

【中文标题】在整数列上使用 Like 运算符进行过滤【英文标题】:Filtering with Like operator on integer column 【发布时间】:2021-08-24 18:01:26 【问题描述】:

我正在使用mikro-orm 进行与数据库相关的操作。我的 db 实体有一个数字字段:

@Property( defaultRaw: 'srNumber', type: 'number' )
 srNumber!: number;

对应的db列(Postgresql)是:

srNumber(int8)

mikro-orm EntityRepository's findAndCount(where, option)where 参数的查询输入为:

repository.findAndCount("srNumber":"$like":"%1000%", options)

翻译成:

select * from table1 where srNumber like '%1000%'

这里的问题是因为srNumber 列不是字符串,所以存在类型不匹配并且查询失败。像 CAST(srNumber AS TEXT) like '%1000%' 一样投射它应该可以在 db 中工作。

有没有办法在这里指定字段转换?

【问题讨论】:

顺便说一句,您确定该列是一个数字(即您进行算术运算的东西)而不是仅包含数字字符的字符串吗? 一个只包含数字的字符串,是的。 @muistooshort 不用于数值运算。 您可能想要更改列类型;电话号码、SSN 和邮政编码之类的东西看起来像数字,但它们并不是真正的数字。您对这些值进行 LIKE 表示即使它们看起来像数字,它们也不是真正的数字。 【参考方案1】:

您可以在查询中使用自定义 SQL 片段。要绕过严格键入的FilterQuery,您可以使用expr,它只是一个标识函数(返回其参数),因此仅对TS检查有效。

这样的事情应该可以工作:

import  expr  from '@mikro-orm/core';

const res = await repo.findAndCount(
  [expr('cast(srNumber as text)')]:  $like: '%1000%' ,
, options);

https://mikro-orm.io/docs/entity-manager/#using-custom-sql-fragments

【讨论】:

以上是关于在整数列上使用 Like 运算符进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬上使用“LIKE”运算符?

如何使用比较运算符过滤 SQLite 中的数据 [重复]

如何在 JPA 中使用 CONTAINS 而不是 LIKE 进行选择

我如何在猫鼬上使用“LIKE”运算符?

Hibernate Criteria API 中的 SQL 'LIKE' 运算符

如何根据另一个表中的 %LIKE% 值过滤表