Повечето от основните СУБД ни предоставят начин за намиране на низ в низ с помощта на SQL. Под това имам предвид използването на SQL заявка за намиране на позицията на подниз в низ.
Има няколко SQL функции, които ни позволяват да направим това, включително INSTR()
, LOCATE()
, POSITION()
и CHARINDEX()
. Функцията, която използвате, ще зависи от вашата СУБД и евентуално дали трябва да посочите начална позиция или не.
Оракул
Oracle има INSTR()
функция, която връща началната позиция на даден подниз в низ.
Пример:
SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;
Резултат:
5
Това ни показва, че поднизът fat
започва от позиция 5 в низа Big fat cat
.
Възможно е да посочите начална позиция чрез предаване на трети аргумент. Можем също да предадем четвърти аргумент, за да посочим кое събитие да намерим:
SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;
Резултат:
7
В този случай започнах търсенето на позиция 1
и потърси второто появяване (чрез използване на 2
като четвърти аргумент).
Oracle също има INSTRB()
функция, която прави подобно нещо, с изключение на това, че връща позицията в байтове.
MySQL
MySQL има INSTR()
функция, която прави нещо подобно на едноименната функция на Oracle Database:
SELECT INSTR('Cats and dogs like to run', 'dogs');
Резултат:
10
Ако обаче трябва да посочите начална позиция, ще трябва да използвате или LOCATE()
или POSITION()
:
SELECT LOCATE('cat', 'One cat jumped over the other cat', 6);
Резултат:
31
Тук е първото поява на cat
започва от позиция 5, но посочих търсенето да започне от позиция 6. Следователно позицията на следващото появяване на този низ беше тази, която беше върната.
Имайте предвид, че въпреки че търсенето е започнало на позиция 6, функцията все още връща позицията на подниза в низа – не от началната позиция.
POSITION()
функцията е синоним на синтаксиса с два аргумента на LOCATE()
, но с малко по-различен синтаксис (POSITION()
не ни позволява да посочим начална позиция).
MySQL също има REGEX_INSTR()
функция, която връща началния индекс на подниза на низа, който съответства на регулярния израз, определен от посочения шаблон.
MariaDB
Подобно на MySQL, MariaDB също има INSTR()
функция, както и a LOCATE()
и POSITION()
функция:
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";
Резултат:
+-------+----------+----------+----------+ | INSTR | POSITION | LOCATE 1 | LOCATE 2 | +-------+----------+----------+----------+ | 4 | 4 | 4 | 17 | +-------+----------+----------+----------+
MariaDB също има REGEX_INSTR()
функция, която връща началния индекс на подниза на низа, който съответства на регулярния израз, определен от посочения шаблон.
SQL сървър
Когато става въпрос за SQL Server, CHARINDEX()
функцията е това, което търсим:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Резултат:
17
В този случай използвах незадължителния трети аргумент, за да посоча начална позиция.
SQL Server също има PATINDEX()
функция, която търси шаблон в низ.
SQLite
SQLite има INSTR()
функция за задоволяване на нашите нужди:
SELECT INSTR('Black cat', 'lack');
Резултат:
2
PostgreSQL
В PostgreSQL трябва да използваме POSITION()
функция:
SELECT POSITION('Break' IN 'Bangkok Breaking');
Резултат:
9