Установить значение массива на указанный c индекс в ClickHouse - PullRequest
0 голосов
/ 06 августа 2020

Можно ли обновить массив по указанному c индексу в существующей строке в базе данных ClickHouse? Что-то вроде alter table mytable set arr[3]=8

1 Ответ

1 голос
/ 07 августа 2020
create table xxx(A Int64, Person Nested (Name String, value String))
Engine=MergeTree order by A;

insert into xxx values (1, ['a','b','c'], ['aaa','bbb','ccc'])

если индекс массива = 3, то name = '1'

alter table xxx update "Person.Name" = 
arrayMap( i-> if(i=3,'1',"Person.Name"[i]), arrayEnumerate("Person.Name")) where 1;

select *  from xxx;
┌─A─┬─Person.Name───┬─Person.value────────┐
│ 1 │ ['a','b','1'] │ ['aaa','bbb','ccc'] │
└───┴───────────────┴─────────────────────┘

если name = a, то name = 1

alter table xxx update "Person.Name" = 
arrayMap( i-> if(i='a','1',i), "Person.Name") where 1;
    
select  * from xxx;
┌─A─┬─Person.Name───┬─Person.value────────┐
│ 1 │ ['1','b','c'] │ ['aaa','bbb','ccc'] │
└───┴───────────────┴─────────────────────┘

if name = c тогда значение = 333

alter table xxx update "Person.value" = 
arrayMap( (i,j) -> if(j='c','333', i), "Person.value", "Person.Name") where 1;

 select  * from xxx

┌─A─┬─Person.Name───┬─Person.value────────┐
│ 1 │ ['1','b','c'] │ ['aaa','bbb','333'] │
└───┴───────────────┴─────────────────────┘
...