sql >> Databasteknik >  >> RDS >> Mysql

Alternativ till 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

hur som helst var det bättre att omstrukturera ditt schema genom att lägga till en kategoritabell och referensen till den i produktens (huvud)tabellen

REDIGERA

ett annat sätt att hantera detta problem är att använda REGEXP vilket leder till en kortare WHERE klausul (här är vad jag har använt för att testa):

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;

detta kommer att matcha din prod_catg mot det reguljära uttrycket '^1,.*|.*,1$|.*,1,.*' returnig 1 (TRUE) om det matchar, 0 (FALSE) annars.

Då ser din WHERE-sats ut så här:

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

förklaring av 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

Jag är säker på att det här regexp kan vara mycket mer kompakt men jag är inte så bra på reguljära uttryck

självklart kan du ändra kategorin du letar efter i det reguljära uttrycket (försök att ersätta 1 med 7 i exemplet ovan)



  1. CSV Export/Import med PHPExcel

  2. En översikt över Just-in-Time Compilation (JIT) för PostgreSQL

  3. Byt värden för två kolumner mellan två tabeller

  4. Hur man kontrollerar inaktuell statistik