gpt4 book ai didi

mysql - 我可以在 MySQL 中重复使用具有多个条件的 where 子句吗?

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:23 25 4
gpt4 key购买 nike

我正在将许多 MySQL 查询从在 Node.js 应用程序中硬编码到存储过程(用于 Java 应用程序)。在原始的 Node 应用程序中,有一个 SQL 条件保存为常量字符串,作为 where 子句的一部分被替换到许多不同的 SQL 函数中,我不知道如何使用 MySQL 存储函数来完成同样的事情。

常量是一个 SQL 字符串,用于检查用户对象上的各种属性是否为空:

const USER_INFO_NOT_NULL = `u.id IS NOT NULL \
AND u.email IS NOT NULL \
AND u.gender IS NOT NULL \
AND u.date_of_birth IS NOT NULL \
AND u.first_name IS NOT NULL \
AND u.last_name IS NOT NULL`

此 SQL 语句被替换为许多不同的查询,作为它们的 WHERE 语句中的条件之一。

例如:

SELECT COUNT(*) count
FROM User u
WHERE ${USER_INFO_NOT_NULL}
AND some_other_condition
AND another_condition
...

不幸的是,并非所有查询都像上面的查询一样简单,重写每个查询将需要大量工作。

我试过使用存储函数,但是,存储函数只能将标量值作为参数,因此我无法传递用户行。

我也试过让函数获取用户 ID(不理想,因为查询已经查询了用户),查询该用户并根据上述条件返回一个 bool 值。但是,我不确定如何在存储函数中将 SELECTRETURN 结合使用(你能做到吗?)。

我研究了准备好的语句,但是,它们似乎无法以这种方式工作,因为它们只支持有限数量的 SQL 命令。

那么,有没有一种方法可以仅使用 MySQL 功能来执行类似于 Node.js 应用程序中已经存在的操作?

最佳答案

您可以定义一个 View 。

CREATE VIEW user_info_not_null 
SELECT *
FROM User u
WHERE u.id IS NOT NULL
AND u.email IS NOT NULL
AND u.gender IS NOT NULL
AND u.date_of_birth IS NOT NULL
AND u.first_name IS NOT NULL
AND u.last_name IS NOT NULL;

然后你可以像使用表一样使用 View :

SELECT COUNT(*) count
FROM user_info_not_null
WHERE some_other_condition
AND another_condition

在存储过程中,您应该能够使用准备好的语句执行此操作。

SET user_info_not_null = 'u.id IS NOT NULL 
AND u.email IS NOT NULL
AND u.gender IS NOT NULL
AND u.date_of_birth IS NOT NULL
AND u.first_name IS NOT NULL
AND u.last_name IS NOT NULL';
SET @sql = CONCAT('SELECT COUNT(*) count
FROM User u
WHERE ', user_info_not_null, '
AND some_other_condition
AND another_condition');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

您还可以将 WHERE 子句替换为模板:

set template_sql = 'SELECT COUNT(*) count
FROM User u
WHERE ${user_info_not_null}
AND some_other_condition
AND another_condition';
set @sql = REPLACE(template_sql, '${user_info_not_null}', user_info_not_null);

关于mysql - 我可以在 MySQL 中重复使用具有多个条件的 where 子句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58549393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com