Вот результат запроса:
LNAME | LISTAGG
--------------+---------------
| ALEX
BAIRSTOW |
BROAD | STUART
BUTLER |
COOK | ALAISTER,ALEX
HALES | ALEX
JENNINGS |
--------------+---------------
(7 rows)
Я хотел бы получить результат 0, 1 или количество записей в строке, например (ALAISTER, ALEX), равно 2 и пустому формату.
Итак, вывод должен быть таким:
LNAME | LFNAME | LNAME_COUNT | LFNAME_COUNT
----------+---------------+--------------+-------------
BROAD | STUART | 1 | 1
BAIRSTOW | | 1 | 0
COOK | ALAISTER,ALEX | 1 | 2
| ALEX | empty | 1
JENNINGS | | 1 | empty
HALES | ALEX | 1 | 1
BUTLER | | 1 | 0
----------+---------------+--------------+-------------
(7 rows)
Я использовал выражение case, но не смог выделить часть (ALAISTER,ALEX).
Какие dbms вы используете сейчас?
Почему JENNINGS | | 1 | empty
но BUTLER | | 1 | 0
?
Есть некоторые пустые данные и некоторые null.
В SQL Server это можно сделать с помощью LEN()
.
SELECT LNAME, LISTAGG AS LFNAME,
CASE WHEN LNAME IS NULL THEN CAST(0 AS VARCHAR (5))
WHEN LEN(LNAME) > 1 THEN CAST((LEN(LNAME) - LEN(REPLACE(LNAME, ',', ''))) + 1 AS VARCHAR (5))
ELSE 'empty' END AS LNAME_COUNT,
CASE WHEN LISTAGG IS NULL THEN CAST(0 AS VARCHAR (5))
WHEN LEN(LISTAGG) > 1 THEN CAST((LEN(LISTAGG) - LEN(REPLACE(LISTAGG, ',', ''))) + 1 AS VARCHAR (5))
ELSE 'empty' END AS LFNAME_COUNT
FROM TableName
Демонстрация db<>fiddle для SQL Server
Если ваша СУБД — MySQL, просто измените LEN()
на LENGTH()
Следующий запрос сделает то, что вы ищете
Declare @table table ( lname varchar (20), listagg varchar (20));
insert into @table ( lname , listagg ) values
('' , 'alex'),
('bairstow', null),
('broad' , 'stuart'),
('butler' , ''),
('cook' , 'alaister,alex'),
('hales' , 'alex'),
('jennings', null);
select
lname,
listagg as LFName,
case when lname <>'' then len(lname)-len(replace(lname,',',''))+1 else 0 end as LName_count,
case when listagg <>'' then len(listagg)-len(replace(listagg,',',''))+1 else 0 end as LFName_count
from @table
Не могли бы вы показать нам не только результат вашего текущего запроса, но и этот запрос вместе с входными данными?