SELECT GROUP_BY 和 GROUP_CONCAT 中的相同值 table 仅当其中一个值具有 NULL 字段时
SELECT GROUP_BY and GROUP_CONCAT same values in a table only if one of the values has a NULL field
我有一个 table 完整的姓名和地址。我想合并 (group_concat) 所有具有相同城市状态和名称值的行,但前提是其中一个地址是 NULL 值。例如我可能有这个 table:
name | addr | city | state | phone
jon snow | 123 got st | la | CA | 1234567890
jon snow | NULL | la | CA | 1225556789
walker | 777 diff ln| la | CA | 4556678899
walker |456 crown rd| la | CA | 33344455566
我希望结果是:
name | addr | city | state | phone
jon snow | 123 got st | la | CA | 1234567890,1225556789
walker | 777 diff ln| la | CA | 4556678899
walker |456 crown rd| la | CA | 33344455566
目前我正在使用以下命令:
SELECT name, group_concat(distinct(addr)) as addr, city, state, group_concat(distinct phone) as phone from got_table group by name, city, state having count(*) >1;
这最终会合并具有相同名称、城市、州的所有地址,即使有两个非空地址也是如此。上述语句的结果如下所示:
name | addr | city | state | phone
jon snow | 123 got st | la | CA | 1234567890,1225556789
walker | 777 diff ln, 456 crown rd| la | CA | 4556678899, 33344455566
有没有一种方法可以仅在其中一个行的地址为 NULL 时进行合并,并且仅在只有 2 行匹配时才执行此 group_concat。
您可以尝试使用子查询 CASE WHEN
进行分组。
检查addr
列是否NULL
得到。
addr
IS NULL 获取 MAX
值或您期望的按 concat 值分组。
addr
IS NOT NULL 得到 addr
看起来像这样。
CREATE TABLE got_table(
name varchar(50),
addr varchar(50),
city varchar(50),
state varchar(50),
phone varchar(50)
);
insert into got_table values ('jon snow','123 got st' ,'la', 'CA', '1234567890');
insert into got_table values ('jon snow',NULL ,'la', 'CA', '1225556789');
insert into got_table values ('walker','777 diff ln' ,'la', 'CA' , '4556678899');
insert into got_table values ('walker','456 crown rd','la', 'CA' , '33344455566');
查询 1:
SELECT name,
case when addr is null then
(
SELECT MAX(tt.addr)
FROM got_table tt
WHERE t1.name = tt.name
and t1.city = tt.city
and t1.state = tt.state
) else addr end as address,
city,
state,
group_concat(distinct phone) as phone
from got_table t1
group by name, city, state,address
| name | address | city | state | phone |
|----------|--------------|------|-------|-----------------------|
| jon snow | 123 got st | la | CA | 1225556789,1234567890 |
| walker | 456 crown rd | la | CA | 33344455566 |
| walker | 777 diff ln | la | CA | 4556678899 |
我有一个 table 完整的姓名和地址。我想合并 (group_concat) 所有具有相同城市状态和名称值的行,但前提是其中一个地址是 NULL 值。例如我可能有这个 table:
name | addr | city | state | phone
jon snow | 123 got st | la | CA | 1234567890
jon snow | NULL | la | CA | 1225556789
walker | 777 diff ln| la | CA | 4556678899
walker |456 crown rd| la | CA | 33344455566
我希望结果是:
name | addr | city | state | phone
jon snow | 123 got st | la | CA | 1234567890,1225556789
walker | 777 diff ln| la | CA | 4556678899
walker |456 crown rd| la | CA | 33344455566
目前我正在使用以下命令:
SELECT name, group_concat(distinct(addr)) as addr, city, state, group_concat(distinct phone) as phone from got_table group by name, city, state having count(*) >1;
这最终会合并具有相同名称、城市、州的所有地址,即使有两个非空地址也是如此。上述语句的结果如下所示:
name | addr | city | state | phone
jon snow | 123 got st | la | CA | 1234567890,1225556789
walker | 777 diff ln, 456 crown rd| la | CA | 4556678899, 33344455566
有没有一种方法可以仅在其中一个行的地址为 NULL 时进行合并,并且仅在只有 2 行匹配时才执行此 group_concat。
您可以尝试使用子查询 CASE WHEN
进行分组。
检查addr
列是否NULL
得到。
addr
IS NULL 获取MAX
值或您期望的按 concat 值分组。addr
IS NOT NULL 得到addr
看起来像这样。
CREATE TABLE got_table(
name varchar(50),
addr varchar(50),
city varchar(50),
state varchar(50),
phone varchar(50)
);
insert into got_table values ('jon snow','123 got st' ,'la', 'CA', '1234567890');
insert into got_table values ('jon snow',NULL ,'la', 'CA', '1225556789');
insert into got_table values ('walker','777 diff ln' ,'la', 'CA' , '4556678899');
insert into got_table values ('walker','456 crown rd','la', 'CA' , '33344455566');
查询 1:
SELECT name,
case when addr is null then
(
SELECT MAX(tt.addr)
FROM got_table tt
WHERE t1.name = tt.name
and t1.city = tt.city
and t1.state = tt.state
) else addr end as address,
city,
state,
group_concat(distinct phone) as phone
from got_table t1
group by name, city, state,address
| name | address | city | state | phone |
|----------|--------------|------|-------|-----------------------|
| jon snow | 123 got st | la | CA | 1225556789,1234567890 |
| walker | 456 crown rd | la | CA | 33344455566 |
| walker | 777 diff ln | la | CA | 4556678899 |