sql >> Databáze >  >> RDS >> Mysql

Alternativa ke klauzuli LIKE v Mysql

prod_catg LIKE '1,%' --matches when 1 is the first category
OR prod_catg LIKE '%,1,%' --matches when 1 is somewhere in the middle
OR prod_catg LIKE '%,1' --matches 1 when is the last category

každopádně bylo lepší refaktorovat své schéma přidáním tabulky kategorií a odkazu na ni do (hlavní) tabulky produktu

UPRAVIT

dalším způsobem, jak tomuto problému čelit, je použití REGEXP což povede ke kratšímu WHERE klauzule (zde je to, co jsem použil k testování):

DECLARE @regexp VARCHAR(100);
SET @regexp = '^1,.*|.*,1$|.*,1,.*';

SELECT
    '1,11,15,51,22,31' REGEXP @regexp AS test1,
    '51,11,15,1,22,31' REGEXP @regexp AS test2,
    '11,15,51,22,31,1' REGEXP @regexp AS test3,
    '7,11,15,51,22,31' REGEXP @regexp AS test4,
    '51,11,15,7,22,31' REGEXP @regexp AS test5,
    '11,15,51,22,31,7' REGEXP @regexp AS test6;

toto bude odpovídat vašemu prod_catg proti regulárnímu výrazu '^1,.*|.*,1$|.*,1,.*' returnig 1 (TRUE) pokud se shoduje, 0 (FALSE) jinak.

Potom bude vaše klauzule WHERE vypadat takto:

WHERE prod_catg REGEXP '^1,.*|.*,1$|.*,1,.*'

vysvětlení regulárního výrazu:

^1,.* --matches 1 at the beginning of a string followed by a `,` and any other char
.*,1$ --matches 1 at the end of a string preceded by a `,` and any other char
.*,1,.* --matches 1 between two `,` which are sourrounded by any other chars
| --is the OR operator

Jsem si jistý, že tento regulární výraz by mohl být mnohem kompaktnější, ale nejsem tak dobrý s regulárními výrazy

samozřejmě můžete změnit kategorii, kterou hledáte v regulárním výrazu (zkuste nahradit 1 s 7 na příkladu výše)



  1. PHP MySQL vloží dotaz na vytváření multimenzionálního asociativního pole z klíčů pole

  2. Schéma zpětného inženýrství (orákula) k ERD

  3. php mysql získat proměnná data z databáze a vypočítat

  4. Spravovaný ovladač ODP.NET se nezobrazuje v dialogovém okně Zdroj dat