Autor | Zpráva | ||
---|---|---|---|
pajadvorak Profil |
#1 · Zasláno: 11. 9. 2016, 18:32:33
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 |
#2 · Zasláno: 11. 9. 2016, 19:43:24
SELECT * FROM table WHERE replace(column, '-', '') = 'WD14351'; 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 |
#3 · Zasláno: 11. 9. 2016, 20:14:40
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 |
#4 · Zasláno: 11. 9. 2016, 20:49:35
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 |
#5 · Zasláno: 12. 9. 2016, 07:05:04
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] .
|
||
Časová prodleva: 10 měsíců
|
|||
pajadvorak Profil |
#6 · Zasláno: 27. 6. 2017, 21:40:42
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 |
#8 · Zasláno: 28. 6. 2017, 16:52:47
Keeehi:
Promiň, ale teď nerozumím, co tím myslíš...? Můžeš mi to prosím osvětlit. Děkuji. |
||
Keeehi Profil |
#9 · Zasláno: 28. 6. 2017, 18:11:16
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 |
#10 · Zasláno: 28. 6. 2017, 20:45:41
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 |
#11 · Zasláno: 28. 6. 2017, 21:56:10
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 |
#12 · Zasláno: 29. 6. 2017, 18:28:09
Keeehi:
Ano, takto to opravdu jde, ale hodně to zatěžuje server. Jediná možnost jsou ty regulární výrazy. |
||
TomášK Profil |
#13 · Zasláno: 29. 6. 2017, 20:15:19
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 |
#14 · Zasláno: 29. 6. 2017, 20:49:02
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áš. |
||
Časová prodleva: 6 let
|
0