NodeJS - 如果没有从存储过程中找到记录,则mysql存储过程给出空行

时间:2018-03-09 18:25:31

标签: mysql node.js

我使用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

1 个答案:

答案 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