0

如果没有中间名,我希望得到没有中间名的全名,但如果列“M_NAME”为 Null,则 select 语句返回空。我该如何解决这个问题?

   SELECT CONCAT(`Employee`.`F_NAME`, ' ', LEFT(`Employee`.`M_NAME`, 1), '. ', `Employee`.`L_NAME`) FROM `ccms`.`Employee` WHERE HR_ID = '223';
4

4 回答 4

2

采用COALESCE()

返回列表中的第一个非 NULL 值,如果没有非 NULL 值,则返回 NULL。

SELECT CONCAT(`Employee`.`F_NAME`, ' ', COALESCE(LEFT(`Employee`.`M_NAME`, 1), ''), '. ', `Employee`.`L_NAME`) FROM `ccms`.`Employee` WHERE HR_ID = '223';
于 2013-02-21T14:08:58.657 回答
2

CONCATNULL如果任何参数为空,则返回。IFNULL您可以通过将任何可为空的列包装在or 中来确保没有空参数为空COALESCE(后者可以采用两个以上的参数)来解决此问题。

SELECT
    CONCAT(
        IFNULL(F_NAME, ''),
        ' ',
        IFNULL(CONCAT(LEFT(M_NAME, 1), '. '), ''),
        IFNULL(L_NAME, '')
    )
FROM
    ccms.Employee
WHERE
    HR_ID = '223';

NULL这样做是用空字符串替换列值,这可能是您的意图。请注意,我更新了 的选择,M_NAME以便仅在值不为空时才通过使用此行为添加句点。

编辑:如果需要,您可以使用反引号和限定列名,但对于这个确切的查询,这不是必需的。

于 2013-02-21T14:13:54.903 回答
1

使用IFNULL().

任何你有可能为 NULL 字段的地方,用 IFNULL(whatever, '') 包装它,然后你会得到一个空字符串而不是一个杀死结果的 NULL。

于 2013-02-21T14:14:25.513 回答
-1

另一个简单的解决方案是使用CONCAT_WS。它肯定会起作用。

SELECT CONCAT_WS('' F_NAME, '', LEFT(M_NAME, 1), L_NAME) FROM ccms.Employee WHERE HR_ID = '223';

于 2013-02-21T14:23:47.433 回答