De meeste van de belangrijkste DBMS'en bieden ons een manier om een string in een string te vinden met behulp van SQL. Hiermee bedoel ik een SQL-query gebruiken om de positie van een substring binnen een string te vinden.
Er zijn verschillende SQL-functies waarmee we dit kunnen doen, waaronder INSTR()
, LOCATE()
, POSITION()
, en CHARINDEX()
. Welke functie u gebruikt, hangt af van uw DBMS en mogelijk van het al dan niet opgeven van een startpositie.
Oracle
Oracle heeft een INSTR()
functie die de startpositie van een gegeven subtekenreeks binnen een tekenreeks retourneert.
Voorbeeld:
SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;
Resultaat:
5
Dit laat ons zien dat de substring fat
begint op positie 5 in de string Big fat cat
.
Het is mogelijk om een startpositie te specificeren door een derde argument door te geven. We kunnen ook een vierde argument doorgeven om aan te geven welke gebeurtenis moet worden gevonden:
SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;
Resultaat:
7
In dit geval begon ik de zoekopdracht op positie 1
en zocht naar de tweede instantie (met behulp van 2
als het vierde argument).
Oracle heeft ook een INSTRB()
functie die iets soortgelijks doet, behalve dat het de positie in bytes teruggeeft.
MySQL
MySQL heeft een INSTR()
functie die hetzelfde doet als de gelijknamige functie van Oracle Database:
SELECT INSTR('Cats and dogs like to run', 'dogs');
Resultaat:
10
Als u echter een startpositie moet specificeren, moet u ofwel LOCATE()
gebruiken of POSITION()
:
SELECT LOCATE('cat', 'One cat jumped over the other cat', 6);
Resultaat:
31
Hier, het eerste voorkomen van cat
begint op positie 5, maar ik heb opgegeven dat de zoekopdracht moet beginnen op positie 6. Daarom was de positie van de volgende instantie van die tekenreeks degene die werd geretourneerd.
Merk op dat, hoewel het zoeken begon op positie 6, de functie nog steeds de positie van de substring binnen de string retourneert – niet vanaf de startpositie.
De POSITION()
functie is een synoniem voor de syntaxis met twee argumenten van LOCATE()
, maar met een iets andere syntaxis (POSITION()
staat ons niet toe om een startpositie te specificeren).
MySQL heeft ook een REGEX_INSTR()
functie die de startindex retourneert van de subtekenreeks van de tekenreeks die overeenkomt met de reguliere expressie gespecificeerd door het gespecificeerde patroon.
MariaDB
Net als MySQL heeft MariaDB ook een INSTR()
functie, evenals een a LOCATE()
en POSITION()
functie:
SELECT
INSTR('No news is good news', 'news') AS "INSTR",
POSITION('news' IN 'No news is good news') AS "POSITION",
LOCATE('news', 'No news is good news') AS "LOCATE 1",
LOCATE('news', 'No news is good news', 5) AS "LOCATE 2";
Resultaat:
+-------+----------+----------+----------+ | INSTR | POSITION | LOCATE 1 | LOCATE 2 | +-------+----------+----------+----------+ | 4 | 4 | 4 | 17 | +-------+----------+----------+----------+
MariaDB heeft ook een REGEX_INSTR()
functie die de startindex retourneert van de subtekenreeks van de tekenreeks die overeenkomt met de reguliere expressie gespecificeerd door het gespecificeerde patroon.
SQL-server
Als het op SQL Server aankomt, is de CHARINDEX()
functie is wat we zoeken:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Resultaat:
17
In dit geval heb ik het optionele derde argument gebruikt om een startpositie op te geven.
SQL Server heeft ook een PATINDEX()
functie die zoekt naar een patroon binnen een string.
SQLite
SQLite heeft een INSTR()
functie om aan onze behoeften te voldoen:
SELECT INSTR('Black cat', 'lack');
Resultaat:
2
PostgreSQL
In PostgreSQL moeten we de POSITION()
. gebruiken functie:
SELECT POSITION('Break' IN 'Bangkok Breaking');
Resultaat:
9