在整数列上使用 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 运算符进行过滤的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JPA 中使用 CONTAINS 而不是 LIKE 进行选择