Autor Zpráva
martin6541
Profil
Pěkné pondělí všem.
Potřebuji v databázi u všech zaregistrovaných uživatelů zkontrolovat telefonní číslo a změnit ho tak, aby výsledek byl ve formátu +42011122233
Většinou si uživatelé v minulosti registrovali telefon ve formě 11122233, ale musím počítat se vším.
Poradíte mi prosím, jak to co nejlíp udělat?

Mám to v tabulce _userinfos a sloupec phone_1 kde jedinečné id uživatele je _userinfo_id

Když se dívám do databáze, tak vidím všechny možné zápisy:
0420911828528
+420911241057
+420 948 378 340
+1 (979) 423-9894
0918980029

Napadlo mě ponechat jen správné (+421911241057), u +421 948 378 340 vymazat mezery a u zápisu 11122233 přidat jen předvolbu +420 a zbytek čísel vymazat.
Uživateli pak vyskočí hláška, že si má doplnit číslo a tam ho to už navede na správný zápis.

Jenže, jak sestavit dotaz :)
martin6541
Profil
Přikládám nějaký základ, kterým jsem jen nahrazoval znaky logicky, abych to trochu pročistil:

VYMAZÁNÍ LOMÍTEK A MEZER
UPDATE
j39_virtuemart_userinfos
SET
phone_1 = REPLACE(phone_1,'/','')



PŘIDÁNÍ PŘEDČÍSLÍ ČR
UPDATE
    j39_virtuemart_userinfos
SET
    phone_1 = concat('+420', phone_1)


NAHRAZENÍ PŘEDVOLEB (dvojtá za jendu)
UPDATE
    j39_virtuemart_userinfos
SET
    phone_1 = REPLACE(phone_1,'+420+420','+420') 


VYMAZÁNÍ POLOPRÁZDNÉHO ČÍSLA ('+420')
UPDATE
    j39_virtuemart_userinfos
SET
    phone_1_DELETED_1620896 = ''

A nyní bych potřeboval vytvořit dotaz, který by smazal všechny pole, ve kterých není jen +420 a za tím 9 číslic. Cokoli jiného bych chtěl smazat. Prosím :)
anonym_
Profil *
martin6541:
A nyní bych potřeboval vytvořit dotaz, který by smazal všechny pole, ve kterých není jen +420 a za tím 9 číslic. Cokoli jiného bych chtěl smazat.
Tak to by měl být jednoduchý regex, ne? Syntaxi SQL dotazu neznám, nicméně ten regex by měl být `^\+420\d{9}$`, resp. tam, kde je negován, číslo odstranit.
martin6541
Profil
Následně jsem smazal všechny pole, které se neskládalo pouze z čísel a znaménka +
-- SMAZÁNÍ POLÍ, KDE POLE NENÍ TVOŘENO POUZE + A ČÍSLY
UPDATE
    j39_virtuemart_userinfos
SET
    phone_1 = ''
-- za podmínky že pole obsahuje pouze čísla a znaménko +        
WHERE phone_1 regexp '[^0-9+]+';

Pořád ještě musím najít způsob, jak odstranit vyskytující se dva typy zápisu:
1. se slovenskou předvolbou (podmínka níže mi zatím nefunguje)
HERE phone_1 REGEXP '^+421';
2. zápisy, které mají jiný počet číslic než 12


anonym:
`^\+420\d{9}$`
díky, vyzkouším


anonym:
`^\+420\d{9}$`

Hlásí mi to chybu....

/*Error: "
#42000Got error 'nothing to repeat at offset 1' from regexp" in 1 statement*/

Složil jsem to takto:
-- SMAZÁNÍ POLÍ, KDE POLE NENÍ S ČESKOU PŘEDVOLBOU ZATÍM 9 ČÍSLIC
UPDATE
    j39_virtuemart_userinfos
SET
    phone_1 = ''
-- za podmínky že pole obsahuje slovenskou předvolbu    
WHERE phone_1 REGEXP '^\+420\d{9}$';
Kajman
Profil
Aby se dostalo zpětné lomítko dál (do reguláru), tak ho ve stringu musíte escapovat (tedy napsat dvě zpětná lomítka).

A hlavně byste teď mazal ty, co jsou v pořádku. Zapomněl jste na zmíněnou negaci. Raději si udělejte nejdříve select s tou podmínkou před úpravou. Pak uvidíte, že se budou mazat i správně zapsaná slovenská čísla, i když tam tu negaci dáte.
martin6541
Profil
Kajman:
Zapomněl jste na zmíněnou negaci.
Máte namysli?
WHERE phone_1 REGEXP '^\+420\d{9}$';
Nebo něco jiného.

v SQL se v podstatě nevyznám, takže složitější vysvětlování už nepoberu :)

Nyní jsem ve fázi, že vše kromě +420 a devět číslic zatím chci smazat....
Kajman
Profil
WHERE phone_1 NOT REGEXP '^\\+420\\d{9}$'
martin6541
Profil
Kajman:
WHERE phone_1 NOT REGEXP '^\\+420\\d{9}$'
když to přečtu jako lama, tak to znamená, že ve sloupci phone_1 vybere všechny zápisy, které načínají +420 a zároveň zatím nemají 9 číslic?
Děkuji
anonym_
Profil *
martin6541:
Měl by ses naučit aspoň základy SQL, aspoň na úrovni čtení již hotových zápisů.

Ten regulár říká, že hledáš řetězec začínající +420 následovaný přesně 9 jakýmikoliv číslicemi. Nic víc, nic míň.
NOT říká, že je to negované, čili hledá všechno, co nezačíná +420 a nepokračuje přesně 9 dalšími číslicemi.
martin6541
Profil
anonym:
Měl by ses naučit aspoň základy SQL, aspoň na úrovni čtení již hotových zápisů.
rád. doporučíš mi nějakou literaturu, nebo web? Nebo online školení?
anonym_
Profil *
martin6541:
Nedoporucim, v #3 jsem psal, ze nejsem databazista. Zdrojů je všude mraky a tady se jedna o základní syntaxi a jednoduchý regex. Není to žádná vyšší dívčí.

Relevantní odkaz pro tebe je dev.mysql.com/doc/refman/8.0/en/regexp.html
martin6541
Profil
anonym:
Děkuji. Myslel sem to ale trochu jinak... chtěl jsem základní radu, jestli mám koupit knihu, nebo hledat na internetu, či si nejlíp zaplatit školení pro začátečníky. Jelikož se v SQL vyznáš, tak asi odhadneš, co z toho mi nejvíc dá :) Ale i tak děkuji za odkaz. Pěkný den.
Keeehi
Profil
martin6541:
To záleží ale hlavně spíš na osobnosti. Někdo má rád strukturované informace a čte si dokumentaci. Někdo si raději přečte knihu kde se dozví proč se to tak dělá. Někomu nevyhovuje formát knihy, jelikož není sto se k tomu dokopat a tak zvolí raději školení, které má pevné termíny. Záleží tedy spíš co vyhovuje tobě.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0