MySQL LIKE IN()?

Mijn huidige zoekopdracht ziet er als volgt uit:

SELECT * FROM fiberbox f WHERE f.fiberBox LIKE '%1740 %' OR f.fiberBox LIKE '%1938 %' OR f.fiberBox LIKE '%1940 %'

Ik heb wat rondgekeken en kan niets vinden dat lijkt op een LIKE IN() – ik stel me voor dat het als volgt werkt:

SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %')

Enig idee? Zie ik het probleem gewoon op de verkeerde manier – een of andere obscure opdracht die ik nog nooit heb gezien.

MySQL 5.0.77-community-log


Antwoord 1, autoriteit 100%

Een REGEXPmisschienefficiënter zijn, maar je zou het moeten benchmarken om zeker te zijn, bijvoorbeeld

SELECT * from fiberbox where field REGEXP '1740|1938|1940'; 

Antwoord 2, autoriteit 39%

Paul Dixons antwoord werkte uitstekend voor mij. Om hieraan toe te voegen, zijn hier enkele dingen die ik heb opgemerkt voor diegenen die geïnteresseerd zijn in het gebruik van REGEXP:

Meerdere LIKE-filters met jokertekens bereiken:

SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
                           OR field LIKE '%1938 %'
                           OR field LIKE '%1940 %';  

Gebruik REGEXP-alternatief:

SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';

Waarden binnen REGEXP-aanhalingstekens en tussen de | (OR) operator worden behandeld als jokertekens. Normaal gesproken vereist REGEXP wildcard-expressies zoals (.*)1740 (.*) om te werken als %1740 %.

Als u meer controle nodig heeft over de plaatsing van het jokerteken, gebruikt u enkele van deze varianten:

LIKE bereiken met gecontroleerde plaatsing van jokertekens:

SELECT * FROM fiberbox WHERE field LIKE '1740 %'
                          OR field LIKE '%1938 '
                          OR field LIKE '%1940 % test';  

Gebruik:

SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
  • Het plaatsen van ^ voor de waarde geeft het begin van de regel aan.

  • Als u $ achter de waarde plaatst, geeft dit het einde van de regel aan.

  • Het plaatsen van (.*) gedraagt ​​zich net als het % jokerteken.

  • Het . geeft een enkel teken aan, behalve regeleinden. plaatsen.
    binnen () met * (.*) voegt een herhalend patroon toe dat een willekeurig nummer aangeeft
    aantal tekens tot het einde van de regel.

Er zijn efficiëntere manieren om specifieke overeenkomsten te verfijnen, maar dat vereist meer beoordeling van reguliere expressies. OPMERKING: Niet alle regex-patronen lijken te werken in MySQL-instructies. Je moet je patronen testen en kijken wat werkt.

Tot slot, om meerdere LIKE- en NIET LIKE-filters te bereiken:

SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
                          OR field LIKE '%1938 %'
                          OR field NOT LIKE '%1940 %'
                          OR field NOT LIKE 'test %'
                          OR field = '9999';

Gebruik REGEXP-alternatief:

SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
                          OR field NOT REGEXP '1940 |^test ';

OF gemengd alternatief:

SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
                          OR field NOT REGEXP '1940 |^test '
                          OR field NOT LIKE 'test %'
                          OR field = '9999';

Merk op dat ik de niet-ingestelde niet in een apart kan gescheiden. Ik experimenteerde met het gebruik van negatieve patronen, vooruit uitziende patronen, enzovoort. Deze uitdrukkingen leken echter niet de gewenste resultaten op te leveren. In het eerste voorbeeld hierboven gebruik ik ^ 9999 $ om de exacte overeenkomst aan te geven. Hiermee kunt u specifieke overeenkomsten toevoegen aan jokertekens in dezelfde uitdrukking. U kunt dit soort uitspraken echter ook mengen zoals u kunt zien in het vermelde tweede voorbeeld.

Met betrekking tot de prestaties liep ik enkele kleine tests tegen een bestaande tabel en vond geen verschillen tussen mijn variaties. Ik stel me echter voor dat de prestaties een probleem kunnen zijn met grotere databases, grotere velden, meer recordtellingen en complexere filters.

Gebruik zo altijd logica hierboven omdat het logisch is.

Als u meer wilt weten over reguliere expressies, raad ik www.regular-expressions.info aan als een goede referentiesite.


3, Autoriteit 3%

Regexp-manier met lijst met waarden

SELECT * FROM table WHERE field regexp concat_ws("|",
"111",
"222",
"333");

4, Autoriteit 3%

U kunt een inline-weergave of een tijdelijke tabel maken, vul het met u waarden en geeft dit uit:

SELECT  *
FROM    fiberbox f
JOIN    (
        SELECT '%1740%' AS cond
        UNION ALL
        SELECT '%1938%' AS cond
        UNION ALL
        SELECT '%1940%' AS cond
        ) с
ON      f.fiberBox LIKE cond

Hierdoor kan u echter meerdere rijen terugsturen voor een fiberboxDat is zoiets als '1740, 1938', dus deze query kan beter passen:

SELECT  *
FROM    fiberbox f
WHERE   EXISTS
        (
        SELECT  1
        FROM    (
                SELECT '%1740%' AS cond
                UNION ALL
                SELECT '%1938%' AS cond
                UNION ALL
                SELECT '%1940%' AS cond
                ) с
        WHERE   f.fiberbox LIKE cond
        )

5

Sorry, er is geen bediening vergelijkbaar met LIKE INin MySQL.

Als u de achtige operator zonder een join wilt gebruiken, moet u het op deze manier doen:

(field LIKE value OR field LIKE value OR field LIKE value)

Weet je, MySQL zal die query, fyi niet optimaliseren.


6

Dit zou correct zijn:

SELECT * FROM table WHERE field regexp concat_ws("|",(
"111",
"222",
"333"
));

7

Flip-operanden

'a,b,c' like '%'||field||'%'

8

Gewoon een kleine tip:

Ik geef de voorkeur aan het gebruik van de variant RIVE (exact dezelfde opdracht als Regexp ) omdat het meer op natuurlijke taal klinkt en korter is; Nou, slechts 1 char.

Het prefix “R” is voor reg. Exp. Natuurlijk.


9

U kunt het gewenste resultaat worden met behulp van reguliere uitdrukkingen .

SELECT fiberbox from fiberbox where fiberbox REGEXP '[1740|1938|1940]';

We kunnen de bovenstaande query testen, klik op SQL Fiddle

SELECT fiberbox from fiberbox where fiberbox REGEXP '[174019381940]';

We kunnen de bovenstaande query testen, klik op SQL fiddle


Antwoord 10

Je kunt het ook zo gebruiken:

SELECT * FROM fiberbox WHERE fiber IN('140 ', '1938 ', '1940 ')

Antwoord 11

Je kunt het ook zo gebruiken:

SELECT
    * 
FROM
    fiberbox f
    JOIN (
    SELECT
        substring_index( substring_index( '1740,1938,1940', ',', help_topic_id + 1 ), ',',- 1 ) AS sub_ 
    FROM
        mysql.help_topic 
    WHERE
        help_topic_id <(
            length( '1740,1938,1940' )- length(
            REPLACE ( '1740,1938,1940', ',', '' ))+ 1 
        ) AS b 
        ) ON f.fiberBox LIKE concat('%',
    b.sub_,
    '%')

Other episodes