[SQL] Deduplikacja rekordów w bazie

0

Witam,

mam pewien problem, na którym się zatrzymałem i nie umiem go rozwiązać.

Mam tabelę Klienci w bazie. Tabela posiada pola takie jak np. Id, Nazwa_firmy, status_rekordu, id_importu, telefony.

Telefony są w formacie |nr_telefonu|nr_telefonu|itd...

I teraz zaimportowałem nową paczkę do bazy. I chcę zmienić status rekordów z tego ostatniego importu na 'Z', gdzie numer telefonu istniał już wcześniej. Sprawa jest o tyle prostsza, że w nowej paczce mam tylko jeden numer telefonu.

Przygotowałem takie zapytanie

UPDATE klienci SET status_rekordu = 'Z' WHERE id_importu = 2735 AND substring(telefony, 2, 9) in (SELECT substring(telefony,2,9) FROM klienci WHERE id_importu in(2734,2733,2732);

Problem leży w tym, że porównuje to zapytanie tylko pierwsze numery telefonów, chciałbym tutaj zastosować coś podobnego do

ilike '%wartość%'

Żeby zapytanie sprawdziło, że w bazie w rekordach z warunku ten numer się zawiera, bo w zapytaniu, które do tej pory napisałem sprawdza czy jest równy. Nie wiem, czy wystarczająco to opisałem, ale czy ktoś mógłby pomóc?

0

To znaczy w jakim formacie masz te telefony, w array czy jak? Daj przykładowy rekord.

0

Telefony są jako text. Po prostu znak | jest ustalonym separatorem telefonów w polu rekordu.

Słabo z wklejeniem rekordu, bo ciężko to sformatować. Generalnie większość pól to text. Jest id, id_importu i dane teleadresowe, w tym telefon w takim formacie. Np. |123123123|010101010|020202020|

Zazwyczaj jak porównuję to z jednym polem poprzez ilike '%wartość%' jednak to jest dla pojedynczej, a ja chcę, żeby wartością był zbiór rekordów po klauzurze WHERE.

0

To może update po ID:

update
    klienci
set
    status_rekordu = 'Z'
where
   id in (SELECT id 
        FROM   klienci k, 
               Unnest(String_to_array(k.telefon, '|')) s(token) 
        WHERE  Length(token) > 0 
               AND id_importu = 2735 
               AND token IN (SELECT token 
                             FROM   klienci k, 
                                    Unnest(String_to_array(k.telefon, '|')) s(token) 
                             WHERE  id_importu IN( 2734, 2733, 2732 ) 
                                    AND Length(token) > 0) 
     )

http://sqlfiddle.com/#!17/29869/9

0

Ok, przetestuję to rozwiązanie, ale dopiero jutro, bo w 2 minuty nie zdążę :). Co do wybierania po id to faktycznie na to nie wpadłem. Dzięki wielkie za sugestię. Już zacząłem nawet pisać kod w php, który wybierze rekordy do tablicy a potem w foreach poleci po każdym rekordzie i sprawdzi, czy w bazie jakiś jest o takim numerze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1