Sql поиск подстроки в строке: Функция INSTR() в SQL
Содержание
регулярные выражения — SQL — Поиск подстрок в строке, удовлетворяющих условию
Вопрос задан
Изменён
10 месяцев назад
Просмотрен
341 раз
Задача такая. Есть таблица с колонкой, в которой хранятся строки. Например, 2 записи в таблице:
- значение в колонке у первой записи: «<!test><!innertest>car</!innertest></!test><!test><!innersupertest>car2</!innersupertest></!test>»
- значение в колонке у второй записи: «<!test><!innersupertest>car1</!innersupertest></!test>»
Нужен запрос, который для каждой записи в таблице будет проверять данную колонку на существование подстрок «<!test>. ..</!test>», в которых не существет подстроки «<!innersupertest>…</!innersupertest>».
То есть для первой записи мы получим 2 подстроки «<!test>…</!test>»:
- <!test><!innertest>car</!innertest></!test>
- <!test><!innersupertest>car2</!innersupertest></!test>
Из них нам подойдет 1-я, потому что там нет «<!innersupertest>…</!innersupertest>». Значит, первая запись в таблице подошла.
Для второй записи мы получим 1 подстроку «<!test>…</!test>»:
- <!test><!innersupertest>car1</!innersupertest></!test>
В ней есть подстрока «<!innersupertest>…</!innersupertest>», значит вся запись не подходит.
Я пытаюсь понять, можно ли это сделать с помощью регулярных выражений, но пока не получилось.
За помощь буду очень благодарен.
- sql
- регулярные-выражения
- sql-server
- запрос
3
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.
Применение функций
При составлении SQL запросов мы можем использовать встроенные функции.
Например, если мы хотим вывести строку в верхнем регистре, то для этого мы можем использовать функцию UPPER.
SELECT UPPER("Hello world") AS upper_string;
upper_string |
---|
HELLO WORLD |
Встроенная функция – реализованный в СУБД кусок кода, с помощью которого можно выполнять преобразования строковых, числовых и других данных в запросах.
Каждая функция принимает набор аргументов определённого типа, выполняет заложенные в неё операции и обязательно возвращает один из возможных литералов. Стоит отметить, что функции могут принимать как ноль аргументов, так и несколько.
Например, функция NOW() принимает ноль аргументов и возвращает литерал в формате даты, а LENGTH(‘sql-academy’) принимает один строковый аргумент и возвращает числовой литерал «11».
Функций достаточно много, но основные всегда можно найти с помощью поиска в шапке или же на странице справочника функций.
Вот некоторые из них:
LOWER
Возвращает строку, в которой все символы записаны в нижнем регистре
SELECT LOWER('SQL Academy') AS lower_string;
lower_string sql academy YEAR
Возвращает год для указанной даты
SELECT YEAR("2022-06-16") AS year;
year 2022 INSTR
Осуществляет поиск подстроки в строке, возвращая позицию её первого символа. При этом отсчёт
начинается с единицы, а не нуля, как в большинстве языков программирования.Функция работает путём посимвольного сравнения исходной строки с искомой. Например, в строке sql-academy подстрока academy появляется, начиная с пятого символа.
SELECT INSTR('sql-academy', 'academy') AS idx;
LENGTH
Возвращает длину указанной строки.
SELECT LENGTH('sql-academy') AS str_length;
str_length 11
Функции можно применять не только над литералами, но и над значениями, взятыми из таблицы. При этом функция выполняет преобразования для каждой строки отдельно.
Например, давайте вернёмся к нашей базе данных и рассмотрим таблицу FamilyMembers: она содержит имя, статус и дату рождения людей.
Каждое значение этих полей мы можем изменить при выводе. Так нижележащий запрос высчитывает длину полного имени для каждого из членов семьи.
SELECT member_name, LENGTH(member_name) AS fullname_length FROM FamilyMembers;
member_name | fullname_length |
---|---|
Headley Quincey | 15 |
Flavia Quincey | 14 |
Andie Quincey | 13 |
Lela Quincey | 12 |
Annie Quincey | 13 |
Ernest Forrest | 14 |
Constance Forrest | 17 |
Wednesday Addams | 16 |
Поскольку мы знаем, что каждая функция должна вернуть какой-либо из возможных литералов, то её результат также можно использовать в дальнейших расчётах и преобразованиях.
К примеру, мы хотим получить первые три буквы в строке и преобразовать их в заглавные. Для этого нам будет достаточно скомбинировать две функции: LEFT и UPPER, где результат одной функции будет аргументом для второй.
SELECT UPPER(LEFT('sql-academy', 3)) AS str;
str |
---|
SQL |
Или хотим вычислить длину фамилии человека, имея строку в формате имя<пробел>фамилия. Одним из возможных способов вычисления длины фамилии может быть применение функций LENGTH и INSTR, используя формулу <длина фамилии> = <длина всей строки> — (<длина имени> + <длина пробела>):
- Значение <длина всей строки> можно получить с помощью функции LENGTH
- Для <длина имени> + <длина пробела> нужно вычислить позицию символа, где заканчивается имя, и прибавить единицу, т.к. пробел имеет длину «1». Мы можем сделать это используя лишь функцию INSTR, ориентируясь на символ «пробел»
Так как обе функции возвращают числовые литералы, мы можем выполнять арифметические операции над ними. Давайте вычтем одно из другого и получим длину фамилии (lastname_length):
SELECT member_name, LENGTH(member_name) AS full_length, INSTR(member_name, ' ') AS firstname_with_space_length, LENGTH(member_name) - INSTR(member_name, ' ') AS lastname_length FROM FamilyMembers;
member_name | full_length | firstname_with_space_length | lastname_length |
---|---|---|---|
Headley Quincey | 15 | 8 | 7 |
Flavia Quincey | 14 | 7 | 7 |
Andie Quincey | 13 | 6 | 7 |
Lela Quincey | 12 | 5 | 7 |
Annie Quincey | 13 | 6 | 7 |
Ernest Forrest | 14 | 7 | 7 |
Constance Forrest | 17 | 10 | 7 |
Wednesday Addams | 16 | 10 | 6 |
sql — Найти подстроку в строке
спросил
Изменено
6 лет, 9 месяцев назад
Просмотрено
11 тысяч раз
Можно ли проверить, содержится ли определенная подстрока в столбце SQL Server в предоставленной пользователем строке?
Пример:
SELECT * FROM Table WHERE 'случайные слова для проверки, содержащиеся в строке' CONTAINS Column
Насколько я понимаю, CONTAINS не может выполнять такой поиск.
РЕДАКТИРОВАТЬ:
У меня есть полностью проиндексированный текст, и я хотел бы выполнить поиск (самым быстрым методом), если строка, предоставленная мной, содержит слова, которые присутствуют в столбце.
- sql
- sql-сервер
- sql-сервер-2016
1
Вы можете использовать LIKE
:
SELECT * FROM YourTable t WHERE 'случайные слова ....' LIKE '%' + t.column + '%'
Или
ВЫБЕРИТЕ * ИЗ YourTable t ГДЕ t.column LIKE '%случайные слова ....%'
В зависимости от того, что вы имели в виду, сначала выберите записи, в которых столбец содержит часть предоставленной строки. Второй наоборот.
4
Просто используйте синтаксис LIKE
вместе с %
вокруг строки, которую вы ищете:
SELECT * ОТ стол ГДЕ Столбец LIKE '%случайная строка%'
Это вернет все строки в таблице table
, в которой столбец Столбец
содержит текст «какая-то случайная строка».
0
1) Если вы хотите получить данные, начинающиеся с какой-либо буквы, вы можете использовать % этот оператор, подобный этому, в вашем предложении where
WHERE Столбец LIKE "%случайная строка"
2) Если вы хотите, чтобы данные содержали любую букву, вы можете использовать
ГДЕ Столбец LIKE "%случайная строка%"
3) если вы хотите получить данные, оканчивающиеся на какую-либо букву, вы можете использовать
ГДЕ Столбец LIKE "какая-то случайная строка%"
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
Как выполнить поиск подстроки с помощью SQL
Хизар Хаят Саани
Проведение поведенческого собеседования
Многих кандидатов отклоняют или понижают на технических собеседованиях из-за плохой успеваемости в поведенческих или культурных интервью. Пройдите собеседование с помощью этого бесплатного курса, где вы будете практиковаться, уверенно отвечая на поведенческие вопросы интервью.
Поиск подстроки позволяет нам искать определенные части более длинных строк. Это часто облегчает поиск строк в нашей базе данных.
Существует несколько способов выполнения поиска подстроки в таблице в нашей базе данных с использованием языка SQLStructured Query Language: используется для связи с базой данных.
Успешный поиск подстроки ‘wonderful’
Используя
%
Используя символ %
, мы можем определить базовое выражение подстроки, которую мы ищем.
Символ %
в основном относится к оставшимся символам строки .
Давайте рассмотрим несколько примеров:
SELECT Имя пользователя ОТ ПОЛЬЗОВАТЕЛЕЙ ГДЕ имя пользователя, например «A%»
Приведенный выше запрос возвращает таблицу, содержащую все имена пользователей , начиная с и заканчивая A
.
Аналогично, следующий запрос возвращает таблицу, содержащую все имена пользователей , заканчивающиеся на A
:
SELECT Username ОТ ПОЛЬЗОВАТЕЛЕЙ ГДЕ имя пользователя, например "%A"
Чтобы найти подстроку между более длинной строкой, мы должны просто добавить %
в начале и в конце подстроки.
Следующий запрос возвращает таблицу, содержащую все имена пользователей с A
между .
ВЫБЕРИТЕ Имя пользователя ОТ ПОЛЬЗОВАТЕЛЕЙ ГДЕ имя пользователя, например "%A%"
Мы также можем уточнить при поиске подстрок. Следующий запрос возвращает все строки, содержащие I
в качестве третьего символа 9.0130 :
ВЫБЕРИТЕ Имя пользователя ОТ ПОЛЬЗОВАТЕЛЕЙ ГДЕ Имя пользователя типа «--I%»
Мы можем использовать знак %
различными способами для поиска подстроки в нашей базе данных.
Использование
CHARINDEX()
Функция SQL CHARINDEX()
ищет подстроку, которая начинается с указанного места внутри строки.
Эта функция возвращает позицию найденной подстроки в искомой строке или ноль , если подстрока не найдена.
Индексация начинается с 1
. Таким образом, вывод 0
означает, что подстрока не найдена.
Ниже приведен прототип функции:
CHARINDEX(_substring, _string, _start)
Параметр _start
— это начальный индекс поиска. Этот параметр является необязательным.
Рассмотрим пример:
SELECT CHARINDEX('человек', 'Супермен') AS StartPosition;
Приведенный выше запрос возвращает 6
, поскольку подстрока «человек» существует в более длинной строке «Супермен» , начиная с индекса 6
.