sql >> Database teknologi >  >> RDS >> Mysql

Alternativ til LIKE-klausul i 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

alligevel må du hellere refaktorisere dit skema ved at tilføje en kategoritabel og referencen til den i produkttabellen (hoved)

REDIGER

en anden måde at håndtere dette problem på er at bruge REGEXP hvilket vil føre til en kortere WHERE klausul (her er hvad jeg har brugt til at teste):

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;

dette vil matche din prod_catg mod det regulære udtryk '^1,.*|.*,1$|.*,1,.*' returnig 1 (TRUE) hvis det matcher, 0 (FALSE) ellers.

Så vil din WHERE-sætning se sådan ud:

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

forklaring af regexp:

^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

Jeg er sikker på, at dette regexp kunne være meget mere kompakt, men jeg er ikke så god til regulære udtryk

selvfølgelig kan du ændre den kategori, du leder efter i det regulære udtryk (prøv at erstatte 1 med 7 i eksemplet ovenfor)



  1. Nye registreringer siden sidste forespørgsel i MySQL View

  2. Hvordan fjerner jeg en MySQL-database?

  3. Hvordan kan jeg oprette et job eller en begivenhed i mysql

  4. VÆLG data fra flere tabeller?