Autor Zpráva
pajadvorak
Profil
Dobrý den,

již nějakou dobu se tu trápím s vyhledáváním a vrácením správného výsledku. Mám tabulku v dtb, kde se mohou vyskytovat jak zápisy s pomlčkami, tak bez pomlček.

Příklad:

sloupec tabulka: např. WD-14351
dotaz: WD14351
výsledek: řádek, kde je zapsáno jak WD14351, tak i WD-14351

V podstatě potřebuji mysql sdělit, že má pomlčky v sloupcích databáze ignorovat a považovat to za shodu.

Děkuji za jakoukoliv radu.
Keeehi
Profil
SELECT * FROM table WHERE replace(column, '-', '') = 'WD14351';
Bude to ale neskutečně pomalé a náročné na výkon. 1) nad všemi řádky se musí zavolat funkce replace, 2) nemohou se použít indexy.
Nejlepší by asi bylo mít ty sloupce 2, jeden s normálním textem a druhý s normalizovaným (bez pomlček) který bude sloužit pro vyhledávání.
pajadvorak
Profil
Keeehi:
Tohle bohužel vrací 0 výsledek....

myslím, že bych na to měl jít přes regulární výrazy REGEXP.... ale nevím jak :-(
Keeehi
Profil
pajadvorak:
Funguje to správně sqlfiddle.com/#!9/0b559/1/0 Pokud to je někde uprostřed textu, tak pak samozřejmě nemůžeš použít normální porovnání ale LIKE.

SELECT * FROM table WHERE replace(column, '-', '') LIKE '%WD14351%';

Problém je pořád stejný. Není to efektivní.


Co se regulárních výrazů týče, tak pokud víš, kde pomlčka může nebo nemůže být, tak pak by to ještě celkem šlo. WD-?14351, pokud ale dopředu nevíš, kde v řetězci může být pomlčka, ale víš, že bude vždy jen jedna, pak by to vypadalo takto WD14351|W-D14351|WD-14351|WD1-4351|WD14-351|WD143-51|WD1435-1 a pokud nevíš, kolik jich je, tak W-?D-?1-?4-?3-?5-?1.
pajadvorak
Profil
Keeehi:
Mně to fungovat nechce... :-( Takže se zkusím zeptat, zda je problém, že sloupec je text? Protože jinak nevím, čím jiným by to mělo být...
Rád bych totiž viděl tu neefektivitu, než to zavrhnu....

Co se týče těch regulárních výrazů, tak bych to asi věděl (ještě si to ověřím), ale xx-xxxxx = 3 od začátku a pak xxxxxxxx/xx = 3 od konce lomítko.
To celé nějak zakomponovat do zadaného výrazu $array[$i].
pajadvorak
Profil
Máte prosím někdo nápad jak to vymyslet přes regulární výrazy?

1. potřebuji WD14351 rozsekat na jednotlivé znaky, kde ta pomlčka může být kdekoliv
2. zakomponovat tam regulární výrazy... (replace sice funguje, ale hodně to zatěžuje databázi, protože potřebuji hlídat více sloupců a více znaků = /, -, mezeru)

Snažím se, aby mi to našlo co nejvíce výsledků

Děkuji za jakoukoliv radu.
Keeehi
Profil
pajadvorak:
Tak si přidej sloupeček, do kterého vložíš normalizovanou kopii a nad ním budeš vyhledávat.
pajadvorak
Profil
Keeehi:
Promiň, ale teď nerozumím, co tím myslíš...? Můžeš mi to prosím osvětlit. Děkuji.
Keeehi
Profil
Budeš mít dva sloupce, v jednom originální text, v druhém text bez znaků, které chceš ignorovat. První slouží o tomu, aby jsi ho vypisoval, druhý pro hledání.
===========|===========
WD14-351   |WD14351
B 65/8.dnf |B658dnf
...        |...
===========|===========
pajadvorak
Profil
Keeehi:
Rozumím. Ale to mi přijde zbytečně složité. To jsou dlouhé popisy. A dělat všechno zdojené, to mi nepřijde ideální. Vím o tom, že to jde udělat přes regulární výrazy, ale bohužel nevím jak. A co jsem zkoušel, tak mi nefunguje.

Děkuji za snahu mi pomoct. Ale pokud to nebude cesta regulárních výrazů, nemá to smysl.
Keeehi
Profil
pajadvorak:
Toho samého se dá také dosáhnout při běhu, ale nejspíše to bude neskutečně pomalé.
...
WHERE REPLACE(REPLACE(REPLACE(REPLACE(`sloupec`, ' ', ''), '-', ''), '/', ''), '=', '') LIKE '%WD14351%'
...
pajadvorak
Profil
Keeehi:
Ano, takto to opravdu jde, ale hodně to zatěžuje server. Jediná možnost jsou ty regulární výrazy.
TomášK
Profil
Regulární výrazy budou stejně rychlé nebo pomalejší než REPLACE a LIKE. Bez REPLACE mi vyšly asi 2× pomalejší, s REPLACE ± nastejno.
Pokud používáš LIKE '%xxx%' v MySQL, tak se bude dělat full scan, bude to pomalé a bude to zatěžovat databázi. Udělej si ten extra sloupeček a používej LIKE 'xxx%' nebo fulltext index (chová se trochu jinak). Nebo změň databázi na takovou, která to umí indexovat (nabízí se Postgres), nebo se smiř s tím, že to zatěžuje server. Regulární výrazy nejsou řešením tvého problému.
Keeehi
Profil
pajadvorak:
Ano, takto to opravdu jde, ale hodně to zatěžuje server.
To tak bývá, když se to nahrazení používá znova a znova, pro každý dotaz. Proto tam máš mít ten druhý sloupec. Nahrazení se provede jen jedno (při ukládání) a pak už jen vyhledáváš.

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