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 fiberbox
Dat 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 IN
in 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_,
'%')