Как преобразовать результат запроса в совокупный счет каждой строки

Вот результат запроса:

      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).

Не могли бы вы показать нам не только результат вашего текущего запроса, но и этот запрос вместе с входными данными?

Tim Biegeleisen 12.06.2019 09:31

Какие dbms вы используете сейчас?

Shawn.X 12.06.2019 09:32

Почему JENNINGS | | 1 | empty но BUTLER | | 1 | 0 ?

Serg 12.06.2019 09:34

Есть некоторые пустые данные и некоторые null.

Mannu Choudhary 12.06.2019 09:46
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
117
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В 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

Другие вопросы по теме