Sql как найти первую букву

При работе с базой данных 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

chemax

На сайте с 07.01.2009

Offline

206

25 июля 2009, 09:48

11700

Как сделать запрос:

Есть бд. Данные поля title

зеленый галстук

красная заколка

снежная,красивая Зима

кто-то!зеленый/прыгал

как выбрать все записи у которых первая буква слова начинается на З? без учета регистра.

glab

На сайте с 10.09.2008

Offline

42

Что-то вроде этого:

SELECT * FROM table WHERE title LIKE ‘з%’ OR title LIKE ‘% з%’

chemax

На сайте с 07.01.2009

Offline

206

glab:
Что-то вроде этого:

SELECT * FROM table WHERE title LIKE ‘з%’ OR title LIKE ‘% з%’

спасибо за ответ. это мне каждый символ так описывать который встречается, хотя суть понял. думал через регулярки)

ZiNTeR2001

На сайте с 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:
спасибо за ответ. это мне каждый символ так описывать который встречается, хотя суть понял. думал через регулярки)

Только про большие и малые буквы забыли

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

Только про большие и малые буквы забыли

у меня мускул без регистра работает. выдает все гдеесть пробел и за ним буква З

сейчас ваш вариант попробую. тоже спасибо за ответ)

Skom

На сайте с 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 ‘З%’ индекс поможет.

Кнопка вызова админа ()

Skom

На сайте с 02.12.2006

Offline

165

Согласен, смотрел на Like, потому и сморозил 🙂

Но, по большому счёту, поле с таким именем обязано быть с индексом 😀

Добавить комментарий