Autor Zpráva
Casper
Profil
Dobrý den, mám dotaz zda lze provést hromadné nahrazení v databázi pomocí regulárního výrazu. Mám sloupec, kde se mi opakuje část textu a následují další znaky:

textněco
textněcodalšího
textazasněco


a nyní potřebuji nahradit onen string(text) něčím jiným(např.zmena) přičemž ponechat vše co následuje za ním. Aby vzniklo něco takového:

zmenaněco
zmenaněcodalšího
zmenaazasněco


Jako řešení mě napadlo nejprve vybrat mnou požadované záznamy a následně je zpracovat v php a zpětně updatovat v db. To není problém, rád bych však věděl řešení v SQL. Předem děkuji za odpověď
Kajman_
Profil *
Mysql umí jen obyčejné replace...
update tabulka set sloupec=replace(sloupec,'text','zmena')
Casper
Profil
Takže v tomto případě nelze zakomponovat nějaký regulární výraz a využít jeho zpětných referencí pro přesné přejmenování části stringu ve sloupci ?
myslel jsem, že by to mohlo jít nějak takto:
mysql_query(UPDATE tabulka SET sloupec = REPLACE(sloupec , REGEXP 'text(.*?)', 'zmena$1'));


Ovšem vůbec nemám zkušenosti s regulárními výrazy v takovýchto SQL dotazech, byl bych i vděčný za nějaký link (čj/aj) srovnávající využívání regulárních výrazů v php/sql. Popřípadě možnosti využití regulárů v SQL dotazech (i jiné než obyčejné SELECTy). Popřípadě by stačilo vysvětlit, jak (a zda) se využívá zpětných referencí regulárů v SQL. :)
Kajman_
Profil *
Mysql umí jen obyčejné replace Na tento konkrétní případ by měla stačit (ale nezkontroluje, že je 'text' na začátku a nahradí všechny jeho výskyty. Funkce regexp pouze umožňuje kontrolu, zda výraz řetězci odpovídá - tedy žádné nahrazení zpětnými referencemi neumožňuje.
Casper
Profil
Děkuji, to jsem chtěl vědět. O obyčejném REGEXPu samozřejmě vím, čekal jsem však, že jeho funkce by mohli mít širší využití například v podobných příkladech jako je tento...
sysel
Profil
Kajman:
ale nezkontroluje, že je 'text' na začátku
... což by snad šlo provést i pomocí regexpu v podmínce WHERE ...

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