При работе с базой данных SQL вам может понадобиться найти записи, содержащие определенные строки. В этой статье мы разберем, как искать строки и подстроки в MySQL и SQL Server.
Содержание
- Использование операторов WHERE и LIKE для поиска подстроки
- Поиск подстроки в SQL Server с помощью функции CHARINDEX
- Поиск подстроки в SQL Server с помощью функции PATINDEX
- MySQL-запрос для поиска подстроки с применением функции SUBSTRING_INDEX()
Я буду использовать таблицу products_data
в базе данных products_schema
. Выполнение команды SELECT * FROM products_data
покажет мне все записи в таблице:
Поскольку я также буду показывать поиск подстроки в SQL Server, у меня есть таблица products_data
в базе данных products
:
Поиск подстроки при помощи операторов WHERE и LIKE
Оператор WHERE позволяет получить только те записи, которые удовлетворяют определенному условию. А оператор LIKE позволяет найти определенный шаблон в столбце. Эти два оператора можно комбинировать для поиска строки или подстроки.
Например, объединив WHERE с LIKE, я смог получить все товары, в которых есть слово «computer»:
SELECT * FROM products_data WHERE product_name LIKE '%computer%'
Знаки процента слева и справа от «computer» указывают искать слово «computer» в конце, середине или начале строки.
Если поставить знак процента в начале подстроки, по которой вы ищете, это будет указанием найти такую подстроку, стоящую в конце строки. Например, выполнив следующий запрос, я получил все продукты, которые заканчиваются на «er»:
SELECT * FROM products_data WHERE product_name LIKE '%er'
А если написать знак процента после искомой подстроки, это будет означать, что нужно найти такую подстроку, стоящую в начале строки. Например, я смог получить продукт, начинающийся на «lap», выполнив следующий запрос:
SELECT * FROM products_data WHERE product_name LIKE 'lap%'
Этот метод также отлично работает в SQL Server:
Поиск подстроки в SQL Server с помощью функции CHARINDEX
CHARINDEX() — это функция SQL Server для поиска индекса подстроки в строке.
Функция CHARINDEX() принимает 3 аргумента: подстроку, строку и стартовую позицию для поиска. Синтаксис выглядит следующим образом:
CHARINDEX(substring, string, start_position)
Если функция находит совпадение, она возвращает индекс, по которому найдено совпадение, а если совпадение не найдено, возвращает 0. В отличие от многих других языков, отсчет в SQL начинается с единицы.
Пример:
SELECT CHARINDEX('free', 'free is the watchword of freeCodeCamp') position;
Как видите, слово «free» было найдено на позиции 1. Это потому, что на позиции 1 стоит его первая буква — «f»:
Можно задать поиск с конкретной позиции. Например, если указать в качестве позиции 25, SQL Server найдет совпадение, начиная с текста «freeCodeCamp»:
SELECT CHARINDEX('free', 'free is the watchword of freeCodeCamp', 25);
При помощи CHARINDEX можно найти все продукты, в которых есть слово «computer», выполнив этот запрос:
SELECT * FROM products_data WHERE CHARINDEX('computer', product_name, 0) > 0
Этот запрос диктует следующее: «Начиная с индекса 0 и до тех пор, пока их больше 0, ищи все продукты, названия которых содержат слово «computer», в столбце product_name». Вот результат:
Поиск подстроки в SQL Server с помощью функции PATINDEX
PATINDEX означает «pattern index», т. е. «индекс шаблона». Эта функция позволяет искать подстроку с помощью регулярных выражений.
PATINDEX принимает два аргумента: шаблон и строку. Синтаксис выглядит следующим образом:
PATINDEX(pattern, string)
Если PATINDEX находит совпадение, он возвращает позицию этого совпадения. Если совпадение не найдено, возвращается 0. Вот пример:
SELECT PATINDEX('%ava%', 'JavaScript is a Jack of all trades');
Чтобы применить PATINDEX к таблице, я выполнил следующий запрос:
SELECT product_name, PATINDEX('%ann%', product_name) position FROM products_data
Но он только перечислил все товары и вернул индекс, под которым нашел совпадение:
Как видите, подстрока «ann» нашлась под индексом 3 продукта Scanner. Но скорее всего вы захотите, чтобы выводился только тот товар, в котором было найдено совпадение с шаблоном.
Чтобы обеспечить такое поведение, можно использовать операторы WHERE и LIKE:
SELECT product_name, PATINDEX('%ann%', product_name) position FROM products_data WHERE product_name LIKE '%ann%'
Теперь запрос возвращает то, что нужно.
MySQL-запрос для поиска строки с применением функции SUBSTRING_INDEX()
Помимо решений, которые я уже показал, MySQL имеет встроенную функцию SUBSTRING_INDEX(), с помощью которой можно найти часть строки.
Функция SUBSTRING_INDEX() принимает 3 обязательных аргумента: строку, разделитель и число. Числом обозначается количество вхождений разделителя.
Если вы укажете обязательные аргументы, функция SUBSTRING_INDEX() вернет подстроку до n-го разделителя, где n — указанное число вхождений разделителя. Вот пример:
SELECT SUBSTRING_INDEX("Learn on freeCodeCamp with me", "with", 1);
В этом запросе «Learn on freeCodeCamp with me» — это строка, «with» — разделитель, а 1 — количество вхождений разделителя. В этом случае запрос выдаст вам «Learn on freeCodeCamp»:
Количество вхождений разделителя может быть как положительным, так и отрицательным. Если это отрицательное число, то вы получите часть строки после указанного числа разделителей. Вот пример:
SELECT SUBSTRING_INDEX("Learn on freeCodeCamp with me", "with", -1);
От редакции Techrocks: также предлагаем почитать «Индексы и оптимизация MySQL-запросов».
Заключение
Из этой статьи вы узнали, как найти подстроку в строке в SQL, используя MySQL и SQL Server.
CHARINDEX() и PATINDEX() — это функции, с помощью которых можно найти подстроку в строке в SQL Server. Функция PATINDEX() является более мощной, так как позволяет использовать регулярные выражения.
Поскольку в MySQL нет CHARINDEX() и PATINDEX(), в первом примере мы рассмотрели, как найти подстроку в строке с помощью операторов WHERE и LIKE.
Перевод статьи «SQL Where Contains String – Substring Query Example».
Вопрос:
У меня есть столбец SQL с длиной 6. Теперь хочу взять только первый char этого столбца. Существует ли какая-либо строковая функция в SQL?
Лучший ответ:
LEFT(colName, 1)
также сделает это. Это эквивалентно SUBSTRING(colName, 1, 1)
.
Мне нравится LEFT
, так как я нахожу его немного более чистым, но на самом деле нет никакой разницы в любом случае.
Ответ №1
Я предпочитаю:
SUBSTRING (my_column, 1, 1)
потому что это стандартный синтаксис SQL-92 и, следовательно, более портативный.
Строго говоря, стандартная версия была бы
SUBSTRING (my_column FROM 1 FOR 1)
Дело в том, что, переходя от одного к другому, следовательно, к любому подобному варианту поставщика, тривиально.
p.s. Только недавно мне сказали, что функции в стандартном SQL преднамеренно противоположны, имея списки параметров, которые не являются обычными запятыми, чтобы сделать их легко идентифицируемыми как стандартные!
Ответ №2
SUBSTRING ( MyColumn, 1 , 1 )
для первого символа и SUBSTRING ( MyColumn, 1 , 2 )
для первых двух.
Ответ №3
Это можно сделать следующим образом:
DECLARE @SomeString NVARCHAR(20) = 'This is some string'
DECLARE @Result NVARCHAR(20)
и либо
SET @Result = SUBSTRING(@SomeString, 2, 3)
SELECT @Result
@Результат: his
-OR –
SET @Result = LEFT(@SomeString, 6)
SELECT @Result
@Результат: This i
Ответ №4
SELECT SUBSTR(thatColumn, 1, 1) As NewColumn from student
Ответ №5
INPUT
STRMIDDLENAME
--------------
Aravind Chaterjee
Shivakumar
Robin Van Parsee
SELECT STRMIDDLENAME,
CASE WHEN INSTR(STRMIDDLENAME,' ',1,2) != 0 THEN SUBSTR(STRMIDDLENAME,1,1) || SUBSTR(STRMIDDLENAME,INSTR(STRMIDDLENAME,' ',1,1)+1,1)||
SUBSTR(STRMIDDLENAME,INSTR(STRMIDDLENAME,' ',1,2)+1,1)
WHEN INSTR(STRMIDDLENAME,' ',1,1) != 0 THEN SUBSTR(STRMIDDLENAME,1,1) || SUBSTR(STRMIDDLENAME,INSTR(STRMIDDLENAME,' ',1,1)+1,1)
ELSE SUBSTR(STRMIDDLENAME,1,1)
END AS FIRSTLETTERS
FROM Dual;
OUTPUT
STRMIDDLENAME FIRSTLETTERS
--------- -----------------
Aravind Chaterjee AC
Shivakumar S
Robin Van Parsee RVP
Ответ №6
Если вы ищете первую строку char в строке Sql
SELECT CHARINDEX('char', 'my char')
=> return 4
Ответ №7
Выберите первые два символа в выбранном поле с Left(string,Number of Char in int)
SELECT LEFT(FName, 2) AS FirstName FROM dbo.NameMaster
Сначала вам понадобится табличная функция, которая разбивает varchar
и возвращает таблицу с одним столбцом под названием “S”.
CREATE FUNCTION dbo.fn_Split2 (@sep nvarchar(10), @s nvarchar(4000))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + (datalength(@sep)/2), CHARINDEX(@sep, @s, stop + (datalength(@sep)/2))
FROM Pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END) AS s
FROM Pieces
)
Получить инициалы теперь легко:
DECLARE @Initials VARCHAR(8000)
SELECT @Initials = COALESCE(@Initials, '') + SUBSTRING(s, 1, 1) FROM dbo.fn_Split2(' ', 'Michael Joseph Jackson')
SELECT @Initials
Это возвращает “MJJ”, как требуется.
в SQL как выбрать только первую букву?
например, если у меня есть столбец ColumnX и он имеет значение “hippodarts”, как выбрать только букву H?
6 ответов
чтобы получить первую букву строка вы можете использовать left:
SELECT LEFT(ColumnX, 1)
сделать это для слово внутри строки сложнее.
Select LEFT(COLUMNX, 1) From Table
С помощью SUBSTRING ()
SELECT SUBSTRING(columnname, 1, 1) AS firstletter FROM tablename
2
автор: Michael Berkowski
выберите слева (ColumnX, 1) из таблицы
надеюсь, это поможет.
другой вариант!
SELECT CAST(your_col AS CHAR(1))
FROM your_table
На сайте с 07.01.2009
Offline
206
25 июля 2009, 09:48
11700
Как сделать запрос:
Есть бд. Данные поля title
зеленый галстук
красная заколка
снежная,красивая Зима
кто-то!зеленый/прыгал
как выбрать все записи у которых первая буква слова начинается на З? без учета регистра.
На сайте с 10.09.2008
Offline
42
Что-то вроде этого:
SELECT * FROM table WHERE title LIKE ‘з%’ OR title LIKE ‘% з%’
На сайте с 07.01.2009
Offline
206
glab:
Что-то вроде этого:
SELECT * FROM table WHERE title LIKE ‘з%’ OR title LIKE ‘% з%’
спасибо за ответ. это мне каждый символ так описывать который встречается, хотя суть понял. думал через регулярки)
На сайте с 28.05.2008
Offline
42
glab:
Что-то вроде этого:
SELECT * FROM table WHERE title LIKE ‘з%’ OR title LIKE ‘% з%’
Второй вариант даст нам все слова, где есть буква З.
Если честно то давно не заморачивался и уже забыл как.
Но есть Гугл 🙂
www.google.ru -> sql select by first symbol
3-я ссылка
http://www.webmaster-talk.com/php-forum/29405-sql-help-select-1st-letter-last.html
Варианты решения:
1. select * from TABLE where last_name like 'A%';
2. SELECT * FROM webpagetable WHERE SUBSTRING(lastname, 0, 1) = 'm' OR SUBSTRING(lastname, 0, 1) = 'M';
Пробуйте.
ZiNTeR2001 добавил 25.07.2009 в 14:07
chemax:
спасибо за ответ. это мне каждый символ так описывать который встречается, хотя суть понял. думал через регулярки)
Только про большие и малые буквы забыли
На сайте с 07.01.2009
Offline
206
ZiNTeR2001:
Второй вариант даст нам все слова, где есть буква З.
Если честно то давно не заморачивался и уже забыл как.
Но есть Гугл 🙂
www.google.ru -> sql select by first symbol
3-я ссылка
http://www.webmaster-talk.com/php-forum/29405-sql-help-select-1st-letter-last.html
Варианты решения:
1. select * from TABLE where last_name like 'A%';
2. SELECT * FROM webpagetable WHERE SUBSTRING(lastname, 0, 1) = 'm' OR SUBSTRING(lastname, 0, 1) = 'M';
Пробуйте.
ZiNTeR2001 добавил 25.07.2009 в 14:07
Только про большие и малые буквы забыли
у меня мускул без регистра работает. выдает все гдеесть пробел и за ним буква З
сейчас ваш вариант попробую. тоже спасибо за ответ)
На сайте с 02.12.2006
Offline
165
Если у Вас поле не binary, то Like регистр по барабану.
SELECT * FROM table WHERE title REGEXP '^(з|З)'
Cras amet qui numquam amavit quique amavit cras amet
N
На сайте с 06.05.2007
Offline
419
Очередное заблуждение. Regexp и substring работают как функции. Это значит, что сервер считает каждую строку и вызовет с ней функцию.
Эффект от создания индекса по title будет только если вы выбираете поля содержащиеся в индексе. например, только title.
А вот для выражения LIKE ‘З%’ индекс поможет.
Кнопка вызова админа ()
На сайте с 02.12.2006
Offline
165
Согласен, смотрел на Like, потому и сморозил 🙂
Но, по большому счёту, поле с таким именем обязано быть с индексом 😀