1

我在数据库中有三列代表一个人的名字、中间名和姓氏:

            People
|------------------------------------------|
| First_Name  |  Last_name    | Middle_name|
|------------------------------------------|
|  John       |  Hansen       |     T      |
|   NULL      |  Smith        |    NULL    |
|  Jacob      |    NULL       |     J      |
|  Michael    |  Johnson      |    NULL    |
|------------------------------------------|

获得空安全姓氏、名字+中间名的最佳方法是什么。所以从上面的列表中我会得到:

Hansen, John T
Smith
Jacob J
Johnson, Michael

到目前为止,我有:

select concat_ws(', ', name_last, concat_ws(' ', name_first, name_middle)) as name from entity;

但它让我,在我不想要它们的地方落后。

4

2 回答 2

5

如果任何参数是,您可以使用CONCAT将返回的事实:NULLNULL

SELECT COALESCE(CONCAT(last_name, ', ', first_name), last_name, first_name)
FROM People

SQL 小提琴演示


或者,现在您已经编辑了问题以添加 Middle_name 列:

SELECT COALESCE(CONCAT(last_name, ', ', COALESCE(CONCAT(first_name, ' ', middle_name),first_name,middle_name)), 
                last_name, 
                COALESCE(CONCAT(first_name, ' ', middle_name),first_name,middle_name))
FROM People

SQL 小提琴演示

于 2013-09-19T23:56:42.587 回答
0

反过来:您有一个包含“名字中间名姓氏”的全名列,并希望按姓氏排序显示它

使它成为工作,至少它适用于荷兰名字(“van der Boogert”但也适用于单一(艺术家)名字。

这个例子修剪了多余的空格,然后计算全名中的空格数量,所以当它只有一个名字(艺术家名字)时没有逗号

SELECT
    TRIM(fullname) as originalfullname, 
    length(trim(fullname)) -length(replace(TRIM(fullname), ' ', '')) AS countedzeros,
    SUBSTRING_INDEX(TRIM(fullname), ' ', length(TRIM(fullname)) -length(replace(TRIM(fullname), ' ', '')))  AS first_name,
    SUBSTRING_INDEX(TRIM(fullname),  ' ', -1) AS last_name,
    CONCAT(
        SUBSTRING_INDEX(TRIM(fullname),  ' ', -1),
        IF(length(TRIM(fullname)) -length(replace(TRIM(fullname), ' ', '')),', ',''),
      SUBSTRING_INDEX(TRIM(fullname), ' ', length(TRIM(fullname)) -length(replace(TRIM(fullname), ' ', '')))
    ) as dispayname
    FROM catalog
    group by fullname


/*
Theo van den Boogaart => Boogaart, Theo van den
Hergé => Hergé
Jhonny Smith => Smith, Johnny

*/
于 2016-02-13T07:41:06.053 回答