Autor | Zpráva | ||
---|---|---|---|
martin6541 Profil |
#1 · Zasláno: 17. 10. 2022, 10:28:26
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 |
#2 · Zasláno: 17. 10. 2022, 12:01:37
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 * |
#3 · Zasláno: 17. 10. 2022, 12:05:39
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'; 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 |
#5 · Zasláno: 17. 10. 2022, 13:20:26
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 |
#6 · Zasláno: 17. 10. 2022, 13:33:18
Kajman:
„Zapomněl jste na zmíněnou negaci.“ Máte namysli? WHERE phone_1 REGEXP '^\+420\d{9}$'; 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 |
#7 · Zasláno: 17. 10. 2022, 13:58:33
WHERE phone_1 NOT REGEXP '^\\+420\\d{9}$' |
||
martin6541 Profil |
#8 · Zasláno: 17. 10. 2022, 14:16:28
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 * |
#9 · Zasláno: 17. 10. 2022, 14:20:24
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 |
#10 · Zasláno: 17. 10. 2022, 14:35:37
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 * |
#11 · Zasláno: 17. 10. 2022, 15:04:48
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 |
#12 · Zasláno: 18. 10. 2022, 12:30:31
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 |
#13 · Zasláno: 18. 10. 2022, 23:33:22
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ě. |
||
Časová prodleva: 3 roky
|
0