我使用MySQL为NodeJS调用MySQL存储过程。但是,当存储过程中没有匹配的记录时,lib会返回具有null
键值的对象。
以下是存储过程
CREATE DEFINER=`admin`@`%` PROCEDURE `ABC_AP_GET_LOGIN_DETAILS`(v_eml varchar(50))
BEGIN
SELECT
U.ABC_AP_USERS_ID uid
,U.FIRST_NAME fn
,U.LAST_NAME ln
,U.MOB_NUM mob
,U.PWD_HASH pwdhs
,D.ABC_AP_DEPARTMENTS_MASTER_ID did
,D.`NAME` dn
,GROUP_CONCAT(DISTINCT UR.ROLE_MASTER_ID ORDER BY UR.ABC_AP_USER_ROLES_ID ASC SEPARATOR ',') rids
FROM ABC_AP_USERS U
INNER JOIN ABC_AP_USER_ROLES UR ON UR.USER_ID = U.ABC_AP_USERS_ID
INNER JOIN ABC_AP_DEPARTMENTS_MASTER D ON D.ABC_AP_DEPARTMENTS_MASTER_ID = U.DEPARTMENT_ID
WHERE U.EMAIL_ID = v_eml
AND U.IS_ACTIVE = TRUE;
END
当指定的v_eml
没有USERS时。它返回以下内容:
[ [ { uid: null,
fn: null,
ln: null,
mn: null,
pwdhs: null,
did: null,
dn: null,
rids: null } ],
{ fieldCount: 0,
affectedRows: 0,
insertId: 0,
serverStatus: 34,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0 } ]
如果没有匹配的记录,如何使用null值返回空数组而不是Object
?
答案 0 :(得分:0)
这恰好是GROUP_CONCAT
的默认行为,为了避免这种情况(空行),我们必须在查询或存储过程的末尾添加GROUP BY
。
因此,更新后的存储过程为
CREATE DEFINER=`admin`@`%` PROCEDURE `ABC_AP_GET_LOGIN_DETAILS`(v_eml varchar(50))
BEGIN
SELECT
U.ABC_AP_USERS_ID uid
,U.FIRST_NAME fn
,U.LAST_NAME ln
,U.MOB_NUM mob
,U.PWD_HASH pwdhs
,D.ABC_AP_DEPARTMENTS_MASTER_ID did
,D.`NAME` dn
,GROUP_CONCAT(DISTINCT UR.ROLE_MASTER_ID ORDER BY UR.ABC_AP_USER_ROLES_ID ASC SEPARATOR ',') rids
FROM ABC_AP_USERS U
INNER JOIN ABC_AP_USER_ROLES UR ON UR.USER_ID = U.ABC_AP_USERS_ID
INNER JOIN ABC_AP_DEPARTMENTS_MASTER D ON D.ABC_AP_DEPARTMENTS_MASTER_ID = U.DEPARTMENT_ID
WHERE U.EMAIL_ID = v_eml
AND U.IS_ACTIVE = TRUE
GROUP BY UR.USER_ID;
END