Sql премахва дубликати от разделен със запетая низ

Искам да направя заявка в sql-сървър, която може да направи следния изход като колона _B от колона_A. Колоните са тип varchar.

  Column_A                                 column_B
  karim,karim,rahim,masud,raju,raju        karim,rahim,masud,raju
  jon,man,jon,kamal,kamal                  jon,man,kamal
  c,abc,abc,pot                            c,abc,pot

person Biddut    schedule 19.03.2018    source източник
comment
Никога, никога не съхранявайте данни като елементи, разделени със запетая. Това само ще ви създаде много проблеми.   -  person jarlh    schedule 19.03.2018
comment
Коригирайте структурата на данните си, за да бъдете по-съвместими с релационни бази данни. Тогава преструктурирането ще бъде много по-лесно.   -  person Gordon Linoff    schedule 19.03.2018
comment
Защо в първия ред рахимът трябва да бъде изхвърлен в колона B?   -  person Joe Taras    schedule 19.03.2018
comment
Благодаря, редактирах.   -  person Biddut    schedule 19.03.2018
comment
Примерът води до търсенето: sql премахва дубликати от низ, разделен със запетая. Първата страница съдържа stackoverflow.com/questions/42918548/ и stackoverflow.com/questions/20882509/   -  person Dan D.    schedule 19.03.2018


Отговори (2)


Добре хора, съжалявам за неразбирането ми. Първоначално имах различни ключови имена за различни мои снимки arthur.jpg. Извлякох стойностите на пикселите за всяка снимка, след което ги подредих в моя речник, където ключът ще бъде името на картината по азбучен и цифров ред (напр.:arthur1.jpg,arthur2.jpg...) и неговите стойности са стойностите на пикселите за всеки от тях. Опитвам се да направя набор от данни за моето разпознаване на лица, но за това имената на ключовете за различни arthur.jpg трябва всички да бъдат етикетирани в една променлива или име (в този случай 1).
person Shnugo    schedule 19.03.2018
comment
не би ли било по-лесно да използвате REPLACE, за да върнете запетаите? нещо като това? REPLACE(TheParts.query('distinct-values(/x/text())').value('.','varchar(250)') , ' ' , ',') AS ColumnB ? - person hkravitz; 19.03.2018
comment
@hkravitz Е, ако стойностите може да включват празни места, това ще постави запетаи на лоши места... Често се надявах на възможност за предаване на разделител на такива XQuery функции (същото с data()), но това винаги е празно по подразбиране. .. - person Shnugo; 19.03.2018

SQL remove duplicates from comma separated string:

Псевдокод: Направете функция postgresql, която получава като вход низа, разделен със запетая, и създава друг масив в паметта. Разделете низа на запетая, изрежете интервала и избройте всеки елемент, ако елементът не се показва в новия списък, след това го добавете. Накрая изравнете новия масив до низ и връщане.

drop function if exists remove_duplicates_from_comma_separated_string(text);

CREATE or replace FUNCTION remove_duplicates_from_comma_separated_string(arg1 text) 
RETURNS text language plpgsql AS $$ declare 
  item text;  
  split_items text[];  
  ret_items text[];  
  ret_val text; 
BEGIN 
  --split your string on commas and trim whitespace 
  split_items := string_to_array(ltrim(arg1), ','); 
  --enumerate each item, if it doesn't exist in the new array then add it. 
  FOREACH item IN ARRAY split_items LOOP 
    if ( item::text = ANY(ret_items)) then 
    else 
        --append this unique item into ret_items 
        select array_append(ret_items, ltrim(item)) into ret_items; 
    end if;  
  END LOOP; 
  --flatten the final array to a text with comma delimiter 
  SELECT array_to_string(ret_items, ',', '*') into ret_val; 
  return ret_val; 
END; $$;

Така че сега можем да извикаме функцията на таблица по този начин:

drop table if exists foo_table; 
create table foo_table(name text); 
insert into foo_table values('karim,karim,rahim,masud,raju,raju'); 
insert into foo_table values('jon,man,jon,kamal,kamal'); 
insert into foo_table values('jon,man,kamal'); 
insert into foo_table values('c,abc,poty'); 
insert into foo_table values('c,abc,abc,kotb'); 
select remove_duplicates_from_comma_separated_string(name) from foo_table; 

Кое отпечатва:

┌───────────────────────────────────────────────┐ 
│ remove_duplicates_from_comma_separated_string │ 
├───────────────────────────────────────────────┤ 
│ karim,rahim,masud,raju                        │ 
│ jon,man,kamal                                 │ 
│ jon,man,kamal                                 │ 
│ c,abc,poty                                    │ 
│ c,abc,kotb                                    │ 
└───────────────────────────────────────────────┘ 

Фактор haaax на миризмата на кода: 9,5 от 10. Строителният екип гледа как начинаещият програмист удря пирон с тръбния ключ за 90 долара, всички въртят очи.

person Eric Leschinski    schedule 25.07.2021