Většina hlavních DBMS nám poskytuje způsob, jak najít řetězec v řetězci pomocí SQL. Tím mám na mysli použití SQL dotazu k nalezení pozice podřetězce v řetězci.
Existuje několik funkcí SQL, které nám to umožňují, včetně INSTR()
, LOCATE()
, POSITION()
a CHARINDEX()
. Funkce, kterou použijete, bude záviset na vašem DBMS a případně na tom, zda potřebujete zadat počáteční pozici.
Oracle
Oracle má INSTR()
funkce, která vrací počáteční pozici daného podřetězce v řetězci.
Příklad:
SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;
Výsledek:
5
To nám ukazuje, že podřetězec fat
začíná na pozici 5 v řetězci Big fat cat
.
Počáteční pozici je možné určit předáním třetího argumentu. Můžeme také předat čtvrtý argument pro určení, který výskyt se má najít:
SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;
Výsledek:
7
V tomto případě jsem začal hledat na pozici 1
a hledali druhý výskyt (pomocí 2
jako čtvrtý argument).
Oracle má také INSTRB()
funkce, která dělá podobnou věc, kromě toho, že vrací pozici založenou na bajtech.
MySQL
MySQL má INSTR()
funkce, která dělá podobnou věc jako stejnojmenná funkce Oracle Database:
SELECT INSTR('Cats and dogs like to run', 'dogs');
Výsledek:
10
Pokud však potřebujete zadat počáteční pozici, budete muset použít buď LOCATE()
nebo POSITION()
:
SELECT LOCATE('cat', 'One cat jumped over the other cat', 6);
Výsledek:
31
Zde je první výskyt cat
začíná na pozici 5, ale zadal jsem vyhledávání tak, aby začínalo na pozici 6. Pozice dalšího výskytu tohoto řetězce tedy byla ta, která byla vrácena.
Všimněte si, že ačkoli vyhledávání začalo na pozici 6, funkce stále vrací pozici podřetězce v řetězci – nikoli z počáteční pozice.
POSITION()
function je synonymem pro syntaxi se dvěma argumenty LOCATE()
, ale s mírně odlišnou syntaxí (POSITION()
nám neumožňuje určit výchozí pozici).
MySQL má také REGEX_INSTR()
funkce, která vrací počáteční index podřetězce řetězce, který odpovídá regulárnímu výrazu určenému zadaným vzorem.
MariaDB
Stejně jako MySQL má MariaDB také INSTR()
funkce a také a LOCATE()
a POSITION()
funkce:
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";
Výsledek:
+-------+----------+----------+----------+ | INSTR | POSITION | LOCATE 1 | LOCATE 2 | +-------+----------+----------+----------+ | 4 | 4 | 4 | 17 | +-------+----------+----------+----------+
MariaDB má také REGEX_INSTR()
funkce, která vrací počáteční index podřetězce řetězce, který odpovídá regulárnímu výrazu určenému zadaným vzorem.
SQL Server
Pokud jde o SQL Server, CHARINDEX()
funkce je to, co hledáme:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Výsledek:
17
V tomto případě jsem použil volitelný třetí argument k určení počáteční pozice.
SQL Server má také PATINDEX()
funkce, která hledá vzor v řetězci.
SQLite
SQLite má INSTR()
funkce k uspokojení našich potřeb:
SELECT INSTR('Black cat', 'lack');
Výsledek:
2
PostgreSQL
V PostgreSQL musíme použít POSITION()
funkce:
SELECT POSITION('Break' IN 'Bangkok Breaking');
Výsledek:
9