sql - typeorm:如何正确使用 IsNotNull/IsNull?
问题描述
我们创建了一个辅助函数来where
更轻松地创建 s。它适用于 eq、neq、lt 和 gt。现在我们尝试添加 is null/is not null (对于日期列,不确定是否重要)。
该函数的关键部分如下所示:
// This is ran in a loop for every attribute
const query = `${attribute}` ${comparator} :value${index}`;
// if the checked 'value' is NULL then use IsNull(), same for NOT NULL, otherwise simply use value
const params = { [`value${index}`]: value == 'NULL' ? IsNull() : value === 'NOT NULL' ? Not(IsNull()) : value};
// Add this (sub)query to the qb
qb.andWhere(query, params);
现在我们收到一条错误消息:
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '<code>_type = 'not',
_value
= '[object Object]',_useParameter
= true, `_multipl' 附近使用正确的语法”
价值是[object Object]
-如果我们使用哪种有意义IsNotNull()
,对吗?
据我从这条评论IsNull()
中了解到,Not(IsNull())
应该像我们努力的那样工作。我们使用@nestjs/typeorm 7.1.5。
解决方案
要检查 NULL 你需要
qb.andWhere(`${attribute} IS NULL`)
要检查 NOT NULL 你需要
qb.andWhere(`${attribute} IS NOT NULL`)
(注意:对于这些情况,省略第二个参数,参数)。
从您的代码看来,您正在使用字符串值 'NULL' 和 'NOT NULL' 作为值参数,并将这些值作为特殊情况进行检查。您的代码现在将如下所示:
if ((value == 'NULL' && comparator == '=') || (value == 'NOT NULL' && comparator == '<>'))
qb.andWhere(`${attribute} IS NULL`);
if ((value == 'NOT NULL' && comparator == '=') || (value == 'NULL' && comparator == '<>'))
qb.andWhere(`${attribute} IS NOT NULL`);
else
qb.andWhere(`${attribute} ${comparator} :value${index}`, { [`value${index}`]: value});
(在上面的代码中,我检查了标准 SQL 比较运算符的 '=' 和 '<>'。如果您的 SQL 方言使用 'eq' 和 'ne' 代替了你提到的 '=' 和 '<>'在您的问题中,您需要更改上面的代码。如果是这样,请更新您的问题并添加适当的标签以说明您正在使用哪个 SQL 数据库)。
当你测试这个的时候,我建议你打开 TypeOrm full logging,这样你就可以看到实际生成的 SQL 并且可以快速解决任何问题。请参阅TypeOrm 日志记录。
推荐阅读
- macos - macOS Catalina 上的 OpenGL 和 GLSL
- java - spring-boot-maven-plugin - 在随机端口启动 JMX
- c# - docuSign oAuth 无效授权 C# 但在 Postman 中工作
- ios - 为 IOS 构建时,Flutter 构建导致有关应用签名的错误
- node.js - ColorThief.getColor() TypeError: url.indexOf 不是函数
- c - 在调用之前初始化变量时 fgets 失败
- c# - UWP 设计自定义标题栏
- python-3.x - 超越 Seaborn 的传奇
- android - Android One Tap SignIn,生成的 ID 令牌中缺少随机数
- javascript - console.table() 在 Git Bash 上打印奇怪的字符