Die meisten großen DBMS bieten uns eine Möglichkeit, mit SQL eine Zeichenfolge innerhalb einer Zeichenfolge zu finden. Damit meine ich die Verwendung einer SQL-Abfrage, um die Position eines Teilstrings innerhalb eines Strings zu finden.
Es gibt mehrere SQL-Funktionen, die uns dies ermöglichen, einschließlich INSTR()
, LOCATE()
, POSITION()
, und CHARINDEX()
. Welche Funktion Sie verwenden, hängt von Ihrem DBMS ab und möglicherweise davon, ob Sie eine Startposition angeben müssen oder nicht.
Orakel
Oracle hat ein INSTR()
Funktion, die die Startposition einer bestimmten Teilzeichenfolge innerhalb einer Zeichenfolge zurückgibt.
Beispiel:
SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;
Ergebnis:
5
Dies zeigt uns, dass der Teilstring fat
beginnt an Position 5 in der Zeichenfolge Big fat cat
.
Es ist möglich, eine Startposition anzugeben, indem ein drittes Argument übergeben wird. Wir können auch ein viertes Argument übergeben, um anzugeben, welches Vorkommen gesucht werden soll:
SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;
Ergebnis:
7
In diesem Fall habe ich die Suche an Position 1
gestartet und nach dem zweiten Vorkommen gesucht (mithilfe von 2
als viertes Argument).
Oracle hat auch ein INSTRB()
Funktion, die etwas Ähnliches tut, außer dass sie die Position basierend auf Bytes zurückgibt.
MySQL
MySQL hat ein INSTR()
Funktion, die etwas Ähnliches wie die gleichnamige Funktion von Oracle Database macht:
SELECT INSTR('Cats and dogs like to run', 'dogs');
Ergebnis:
10
Wenn Sie jedoch eine Startposition angeben müssen, müssen Sie entweder LOCATE()
verwenden oder POSITION()
:
SELECT LOCATE('cat', 'One cat jumped over the other cat', 6);
Ergebnis:
31
Hier das erste Vorkommen von cat
beginnt an Position 5, aber ich habe angegeben, dass die Suche an Position 6 beginnen soll. Daher war die Position des nächsten Vorkommens dieser Zeichenfolge diejenige, die zurückgegeben wurde.
Beachten Sie, dass die Funktion, obwohl die Suche an Position 6 begonnen hat, immer noch die Position des Teilstrings innerhalb des Strings zurückgibt – nicht von der Startposition.
Die POSITION()
Funktion ist ein Synonym für die Zwei-Argument-Syntax von LOCATE()
, aber mit einer etwas anderen Syntax (POSITION()
erlaubt uns nicht, eine Startposition anzugeben).
MySQL hat auch ein REGEX_INSTR()
Funktion, die den Anfangsindex der Teilzeichenfolge der Zeichenfolge zurückgibt, die mit dem regulären Ausdruck übereinstimmt, der durch das angegebene Muster angegeben ist.
MariaDB
Wie MySQL hat auch MariaDB einen INSTR()
Funktion, sowie ein ein LOCATE()
und POSITION()
Funktion:
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";
Ergebnis:
+-------+----------+----------+----------+ | INSTR | POSITION | LOCATE 1 | LOCATE 2 | +-------+----------+----------+----------+ | 4 | 4 | 4 | 17 | +-------+----------+----------+----------+
MariaDB hat auch einen REGEX_INSTR()
Funktion, die den Anfangsindex der Teilzeichenfolge der Zeichenfolge zurückgibt, die mit dem regulären Ausdruck übereinstimmt, der durch das angegebene Muster angegeben ist.
SQL-Server
Wenn es um SQL Server geht, ist die CHARINDEX()
Funktion ist das, wonach wir suchen:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Ergebnis:
17
In diesem Fall habe ich das optionale dritte Argument verwendet, um eine Startposition anzugeben.
SQL Server hat auch einen PATINDEX()
Funktion, die innerhalb eines Strings nach einem Muster sucht.
SQLite
SQLite hat ein INSTR()
Funktion, um unsere Bedürfnisse zu befriedigen:
SELECT INSTR('Black cat', 'lack');
Ergebnis:
2
PostgreSQL
In PostgreSQL müssen wir die POSITION()
verwenden Funktion:
SELECT POSITION('Break' IN 'Bangkok Breaking');
Ergebnis:
9