sql >> Database >  >> RDS >> Mysql

Alternatief voor LIKE-clausule in 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

hoe dan ook, je kunt je schema beter refactoren door een categorietabel toe te voegen en de verwijzing ernaar in de producttabel (hoofdtabel

)

BEWERKEN

een andere manier om dit probleem aan te pakken is het gebruik van REGEXP wat zal leiden tot een kortere WHERE clausule (hier is wat ik heb gebruikt om te testen):

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;

dit komt overeen met uw prod_catg tegen de reguliere expressie '^1,.*|.*,1$|.*,1,.*' returnig 1 (TRUE) als het overeenkomt, 0 (FALSE) anders.

Uw WHERE-clausule ziet er dan als volgt uit:

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

uitleg van 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

ik weet zeker dat deze regexp veel compacter zou kunnen zijn, maar ik ben niet zo goed met reguliere expressies

U kunt uiteraard de categorie die u zoekt in de reguliere expressie wijzigen (probeer 1 te vervangen met 7 in het bovenstaande voorbeeld)



  1. Wanneer moet ik $wpdb->prepare gebruiken, of helemaal niet?

  2. Hoe kunnen we de hoofdtekst van de gecodeerde opgeslagen procedure in SSMS bekijken?

  3. Converteer één rij naar meerdere rijen met minder kolommen

  4. PHP PDO bindParam() en MySQL BIT