Как найти часть слова в 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 Pattern Matching :

It is used for searching a string or a sub-string to find certain character or group of characters from a string. We can use LIKE Operator of SQL to search sub-string. The LIKE operator is used with the WHERE Clause to search a pattern in string of column. The LIKE operator is used in a conjunction with the two wildcards characters.

  1. Percentage sign( % ) : It represents zero, one or multiple characters of variable length.
  2.  Underscore ( _ ) : It represents one, single character of fixed length.

Example :

In this example we will create a schema for our database and named it as geeksforgeeks. After that we will create a table inside it with the name geeks_data and tried to search a sub string from the data of table.

Step 1: Create a database :

In order to create a database we need to use the CREATE operator.

CREATE DATABASE geeksforgeeks;

Step 2: Create a table inside the database :

In this step we will create the table geeks_data inside the geeksforgeeks database.

CREATE TABLE geeksforgeeks.geeks_data(id INT, 
                                    first_name VARCHAR(255),
                                    last_name VARCHAR(255),
                                    text_description  VARCHAR(255),
                                    PRIMARY KEY(id));

Step 3: Insert data into the table :

In order to insert the data inside the database we need to use INSERT operator.

INSERT INTO geeksforgeeks.geeks_data (id, first_name, last_name, text_description) 
VALUES (1, "Rahul", "Khanna", "I am a backend developer who also like to technical content writing");
id first_name last_name text_description
1 Rahul Khanna I am a backend developer who also like to technical content writing

Step 4: Searching the pattern using Like operator :

SELECT first_name FROM geeksforgeeks.geeks_data WHERE text_description LIKE '%backend%developer%';

Step 5: Output :

We will get the first_name where in the description backend developer is present.

first_name
Rahul

Last Updated :
10 Sep, 2021

Like Article

Save Article


Table of Contents

  • RIGHT and LEFT
  • CHARINDEX
  • SUBSTRING
  • Using them together
  • References
  • See Also

This article explains the functionality and uses of the LEFT, RIGHT, SUBSTRING and CHARINDEX functions in SQL.

This article will leave you with sound knowledge and understanding that you can take away and questions will be asked no more.

We”ll start by explaining each function individually with examples; and then I will show a scenario where these functions can be used together.


RIGHT and LEFT

These functions might sound fairly self explanatory, but unless you have a fundamental understanding of how they behave; you will experience some problems that will keep you scratching your head for a while.

As you can see by this illustration, the LEFT function starts BEFORE the left-most character of a string and moves to the right, while the RIGHT function starts AFTER the right-most character and moves inwards to the left.

SELECT RIGHT('HELLO WORLD', 3);

SELECT LEFT('HELLO WORLD', 3);

Here’s the result:

As you can see, the RIGHT function has expectedly taken the last three characters of the string passed into it, and the LEFT function has taken the first three. Pretty simple!


CHARINDEX

CHARINDEX is another simple function that accepts two arguments. The first argument is the character you are searching for; the second is the string. It will return the first index position that the character passed into the first argument is within the
string.

Now let’s use our CHARINDEX function to find the position of the space in this string:

SELECT CHARINDEX(' ','Hello World');

Here’s the result:

As you can see, the position of the space within “Hello World” is the 6th character. CHARINDEX can be a useful function for finding occurrences of a character within a table programmatically. I will build on this subject later on in this article.


SUBSTRING

I would consider SUBSTRING to be the most useful of all the functions mentioned today. It accepts three arguments, the string, a start position and how many characters it will “step over”. Let’s take a look at that illustration from earlier:

Now I’ll write a simple query to show the use of SUBSTRING:

SELECT SUBSTRING('HELLO WORLD',4,5)

And now the results:

As you can see. SUBSTRING includes spaces as a position within a string. So executing this query shows a “window” of the string that has been passed to it. If we had executed the query as “SELECT SUBSTRING(‘HELLO WORLD’,6,5)” then the results would have
shown ” WORL”.


Using them together

Now I’m going to show an example of how to use these together. Imagine you have a table with a column called “Name”, within that column you have various names, with different lengths; but all have one thing in common, a space. You’re asked to only display
the forename, but because there are differing lengths you will need to find the occurring space in the string.

SELECT CHARINDEX(' ','JOHNNY BELL')

We can use the CHARINDEX function to find the position of the space within the row programmatically. In this instance, the position is “7”. Now we’ve found that we just need to display everything left of that position. We can “wrap” this up within a LEFT
statement to do this (simple right?!).

SELECT LEFT('HELLO WORLD',CHARINDEX(' ','HELLO WORLD')-1)

Notice how I’ve put a “-1” after the CHARINDEX function? This is because the CHARINDEX function is finding the space in the string, but we don’t really want to include this in our resultset, so we’re basically saying “find the position of the space minus
one”. A good way to see this is by looking at the illustration from earlier and count the positions that the function will step over. Remember that the LEFT function takes two arguments, so we need to state the expression within that as well. This will of
course return the result “JOHNNY”.

We hope this helps, thanks for reading and if you have any further questions then don’t hesitate to comment below.

This entry participates in the TechNet Guru contributions for June, 2013 contest.


References

  • String Functions (Transact-SQL)
  • CHARINDEX (Transact-SQL)

See Also

  • T-SQL: Split String with a Twist
  • Transact-SQL Portal

eagl69

10 / 14 / 8

Регистрация: 12.10.2011

Сообщений: 766

1

Запрос на поиск по части слова

02.03.2020, 09:48. Показов 16696. Ответов 12

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день!
Подскажите как правильно сделать запрос по части слова?
Запрос на поиск всего слова:

Python
1
cursor.execute(select * from BUSINESS.V_PLATFORM_DDA where NAME = :jobno, {"jobno" : str(num)})

Пробую так но не получается:

Python
1
2
3
4
cursor.execute("""select * 
                   from BUSINESS.V_PLATFORM_DDA 
                   where NAME like '%'+:jobno+'%'""", 
                   {"jobno" : str(num)})



1



Grossmeister

Модератор

4202 / 3042 / 581

Регистрация: 21.01.2011

Сообщений: 13,170

02.03.2020, 10:05

2

Цитата
Сообщение от eagl69
Посмотреть сообщение

Пробую так но не получается

Поиск по части слова

SQL
1
WHERE fld1 LIKE '%abc%'

А если что не так с кодом на Python – так это в другой форум



1



eagl69

10 / 14 / 8

Регистрация: 12.10.2011

Сообщений: 766

02.03.2020, 10:41

 [ТС]

3

Да в ветке БД питон пусто
вот нашел решение, может кому пригодится.

Python
1
where NAME LIKE '%' || :jobno || '%'



1



Jefe

311 / 271 / 118

Регистрация: 05.06.2013

Сообщений: 868

03.03.2020, 14:48

4

Всегда делал так:

Python
1
2
3
4
5
6
query = """
    select * 
      from BUSINESS.V_PLATFORM_DDA 
     where NAME like '%{jobno}%'
    """.format(jobno=str(num))
cursor.execute(query)

Считал это единственным правильным вариантом и только что узнал, что можно делать как-то иначе.



0



10 / 14 / 8

Регистрация: 12.10.2011

Сообщений: 766

18.03.2020, 12:41

 [ТС]

5

Добрый день!

В принципе оба способа работают, но столкнулся вот с такой проблемой, ищу по части слова которая выглядит так: “_55_” не воспринимаются нижние подчеркивания как часть слова, например из дух ячеек “Д_77_5511” и “Д_55_0911” должно вывестись только “Д_55_0911”, а показывает все…. В чем может быть причина?

И второй вопрос, можно ли отправить еще и имя таблицы? where NAME(где NAME это переменная)



0



Модератор

4202 / 3042 / 581

Регистрация: 21.01.2011

Сообщений: 13,170

18.03.2020, 13:22

6

Цитата
Сообщение от eagl69
Посмотреть сообщение

В чем может быть причина?

Потому что нижнее подчеркивание в LIKE – это шаблонный символ. % означает любой кол. любых символов, а _ – любой один символ.

Цитата
Сообщение от eagl69
Посмотреть сообщение

where NAME(где NAME это переменная)

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



0



Jefe

311 / 271 / 118

Регистрация: 05.06.2013

Сообщений: 868

18.03.2020, 14:28

7

Цитата
Сообщение от eagl69
Посмотреть сообщение

ищу по части слова которая выглядит так: “_55_” не воспринимаются нижние подчеркивания как часть слова, например из дух ячеек “Д_77_5511” и “Д_55_0911” должно вывестись только “Д_55_0911”, а показывает все…

В оракле нижнее подчёркивание экранируется вот так, с указанием экранирующего символа(например ! в моём случае, но можно выбрать другой):

SQL
1
WHERE NAME LIKE '%!_55!_%'  ESCAPE '!'

Или можно делать замену заранее:

SQL
1
WHERE REPLACE(NAME, '_', '!') LIKE '%!55!%'

Цитата
Сообщение от eagl69
Посмотреть сообщение

И второй вопрос, можно ли отправить еще и имя таблицы? where NAME(где NAME это переменная)

Можно.

Python
1
2
3
4
5
6
7
column_name = "NAME"
query = """
    select * 
      from BUSINESS.V_PLATFORM_DDA 
     where {colname} like '%{jobno}%'
    """.format(jobno=str(num), colname=column_name)
cursor.execute(query)



0



eagl69

10 / 14 / 8

Регистрация: 12.10.2011

Сообщений: 766

18.03.2020, 15:29

 [ТС]

8

Цитата
Сообщение от Jefe
Посмотреть сообщение

Можно.

Извиняюсь, ошибся надо передать не имя столбца а имя таблицы

Python
1
2
3
4
5
table = BUSINESS.V_PLATFORM_DDA
"""select * 
    from {tabl1} # так можно?
    where Name like '%{jobno}%'""",
    format(jobno=str(num), tabl1=table)

С подчеркиваниями понял, спасибо.



0



311 / 271 / 118

Регистрация: 05.06.2013

Сообщений: 868

18.03.2020, 16:08

9

Цитата
Сообщение от eagl69
Посмотреть сообщение

from {tabl1} # так можно?

Да, можно. Только в 1й строке в кавычки взять название таблицы, строка как никак.



0



eagl69

10 / 14 / 8

Регистрация: 12.10.2011

Сообщений: 766

18.03.2020, 18:56

 [ТС]

10

Цитата
Сообщение от Jefe
Посмотреть сообщение

Да, можно. Только в 1й строке в кавычки взять название таблицы, строка как никак.

Да, спасибо, забыл написать, ну и еще один вопрос, как сделать поиск без учета регистра?
такой способ не работает:

Python
1
2
3
4
5
table = 'BUSINESS.V_PLATFORM_DDA'
"""select * 
    from {tabl1} # так можно?
    where Name like LOWER('%{jobno}%')""",
    format(jobno=str(num), tabl1=table)



0



Jefe

311 / 271 / 118

Регистрация: 05.06.2013

Сообщений: 868

18.03.2020, 19:34

11

Цитата
Сообщение от eagl69
Посмотреть сообщение

like LOWER(‘%{jobno}%’)

Со стороны Оракла lower добавали, это ок.
Ещё нужно добавить со стороны питона:

Python
1
jobno=str(num).lower()

Добавлено через 3 минуты
Ой, чуть не так:

Python
1
2
3
4
5
table = 'BUSINESS.V_PLATFORM_DDA'
"""select * 
    from {tabl1} # так можно?
    where LOWER(Name) like '%{jobno}%'""",
    format(jobno=str(num).lower(), tabl1=table)



1



10 / 14 / 8

Регистрация: 12.10.2011

Сообщений: 766

18.03.2020, 21:58

 [ТС]

12

Да, спасибо сработало. но вот во второй базе на SQLite не идет.



0



Jefe

311 / 271 / 118

Регистрация: 05.06.2013

Сообщений: 868

19.03.2020, 12:21

13

Лучший ответ Сообщение было отмечено eagl69 как решение

Решение

А с чего бы ему идти и в SQLite?
Там свой синтаксис.
там вот так _55_ должно экранироваться знаком

Python
1
where lower(Name) like '%_{jobno}_%'

, где {jobno} это 55



1



У SQL сервера достаточно много мощных функций для работы со строками и в этом разделе мы рассмотрим наиболее интересные и часто используемые из них. Из моего личного опыта (ваши задачи могут дать другой результат), наиболее часто используемой является функция SUBSTRING. Именно с нее мы и начнем.

SUBSTRING

Помниться, что мы добавили к значениям в колонке имен работников префикс ‘mr.’ (см. разд. 2.17). А как теперь от него избавится во время обращения к таблице? Достаточно просто, если воспользоваться функцией SUBSTRING, которая возвращает указанную часть строки. Этой функции необходимо передать три параметра:

  1. Поле, часть строки которого нужно получить;
  2. Первый символ;
  3. Количество интересующих нас символов.

Посмотрим, как вышесказанное можно реализовать в виде запроса:

SELECT idPeoples,
      CASE SUBSTRING(vcFamil, 1, 3)
        WHEN 'mr.' THEN SUBSTRING(vcFamil, 4, 255)
        ELSE vcFamil
       END
FROM tbPeoples

В этом примере, мы выбираем только два поля: “idPeoples” и поле, результат которого зависит от проверки CASE. В данном случае CASE проверяет результат работы функции SUBSTRING, которая выбирает символы из поля “vcFamil” начиная с первого по третий. Если результат равен ‘mr.’, то необходимо обрезать этот префикс.

Для того, чтобы отбросить ненужные символы от значения поля, мы снова пользуемся функцией SUBSTRING, но теперь выбираем символы, начиная с четвертного (начиная с первого, после ‘mr.’). В качестве количества символов я указал число 255, что больше максимального значения поля, а значит, строка будет выбрана до конца, начиная 4-го.

Теперь попробуем обновить данные в таблице, чтобы в поле “vcName”, чтобы в нем не было лишних символов ‘mr.’. Для этого выполняем следующий запрос:

UPDATE tbPeoples
SET vcFamil=(case SUBSTRING(vcFamil, 1, 3)
      WHEN 'mr.' THEN SUBSTRING(vcFamil, 4, 255)
      ELSE vcFamil
     END)

В этом примере полю “vcName”присваивается результат сравнения CASE, который мы уже рассмотрели выше. Таким образом, мы избавились от лишних букв в фамилиях.

LEFT

Задачу обрезание лишних символов из начала строки можно было бы решить и с использованием функции LEFT, которая возвращает указанное количество символов, начиная с 1-го. Функции нужно передать следующие два параметра:

  1. Поле, подстроку которого нужно получить;
  2. Количество символов.

Следующий пример формирует ФИО, в котором имя и отчество сокращены:

SELECT vcFamil+' '+left(vcName, 1)+'. '+left(vcSurName, 1)+'.'
FROM tbPeoples

Поле “vcFamil” выводится полностью, а вот от имени и отчества выводится только один левый (первый) символ.

Теперь посмотрим, как можно было использовать LEFT для обрезания префикса ‘mr.’:

UPDATE tbPeoples
SET vcFamil=(case LEFT(vcFamil, 3)
      WHEN 'mr.' THEN SUBSTRING(vcFamil, 4, 255)
      ELSE vcFamil
     END)

LEN

Функция LEN позволяет определить длину строки или значения поля. Функции достаточно передать строку или имя поля, длина значений которого нас интересует. Например, следующий запрос отобразить длину всех значений в поле “vcFamil”:

SELECT vcFamil, len(vcFamil)
FROM tbPeoples

В следующем примере мы ищем записи, в которых фамилия состоит 7-и символов:

SELECT vcFamil
FROM tbPeoples
WHERE len(vcFamil)=7

LOWER

Если ваш сервер настроен так, что строки чувствительные к регистру букв, то с поиском по строковым полям могут быть серьезные проблемы. Если вы указали фамилию как Иванов, то это значение не будет равно ИВАНОВ, а значит, мы не увидим необходимую запись. Проблему решает функция LOWER, которая приводит указанную строку к нижнему регистру.

Рассмотрим пример. В следующем запросе мы выбираем все фамилии, при этом они отображаются в нижнем регистре (маленькими буквами):

SELECT LOWER(vcFamil)
FROM tbPeoples

Теперь посмотрим на следующий пример:

SELECT *
FROM tbPeoples
WHERE LOWER(vcFamil)=LOWER('Сидоров')

В секции WHERE, где мы сравниваем значение поля с введенной пользователем фамилией, и то и другое приводится к нижнему регистру. Таким образом, как бы не хранилась фамилия в базе, все Ивановы будут найдены.

UPPER

Функция Upper также изменяет регистр букв, только делает их все большими. Это значит, что функцию можно также использовать для сравнения двух строк разного регистра, если все буквы привести к большим:

SELECT *
FROM tbPeoples
WHERE UPPER(vcFamil)=UPPER('Сидоров')

Если вам нужно сравнить две строки не обращая внимания на используемых регистр букв внутри строк, можно использовать как UPPER, так и LOWER. Разницы никакой нет, поэтому выбирайте то, что больше нравится.

LTRIM и RTRIM

Функция LTRIM убирает все символы пробела в начале строки, а RTRIM убирает пробелы в конце строки. Допустим, что пользователь при вводе фамилии в самом начале случайно зацепил клавишу пробела. Получилось, что в базе хранится две фамилии:

Иванов
 Иванов

Когда смотришь на эти фамилии, то видно, что вторая строка сдвинута вправо за счет пробела вначале. Это значит, что база данных будет воспринимать эти значения по-разному. Чтобы избавится от лишних пробелов, как раз используют функции LTRIM и RTRIM. Например:

SELECT *
FROM tbPeoples
WHERE LTRIM(vcFamil)=LTRIM(' Сидоров')

В этом примере поле “vcFamil” сравнивается с фамилией Сидоров, с пробелом в начале. Чтобы убрать пробел используется функция LTRIM. В следующем примере мы убираем и левые и правые пробелы:

-- Убрать лишние пробелы
SELECT *
FROM tbPeoples
WHERE vcFamil=LTRIM(RTRIM(' Сидоров '))

Если честно, то пробелы справа убираются сервером автоматически. Выполните следующий запрос и убедитесь сами:

SELECT *
FROM tbPeoples
WHERE vcFamil='Сидоров '

Если работник с фамилией Сидоров (без пробелов в конце) существует в таблице, и запрос отобразил его, то сервер автоматически убрал пробел.

PATINDEX

С помощью функции PATINDEX можно искать часть подстроки по определенному шаблону. Допустим, что нам надо найти все фамилии, в которых есть две буквы “о”, между которыми может находиться любой символ. Эту задачу можно решить с помощью следующего запроса:

SELECT vcFamil, PATINDEX('%О_О%', vcFamil)
FROM tbPeoples

Если посмотреть на функцию, то пока не понятно, чем она отличается от LIKE с шаблоном? Все очень просто – LIKE используется для создания ограничений в секции WHERE, а PATINDEX возвращает индекс символа, начиная с которого идет указанный шаблон в строке. Если бы мы использовали LIKE, то сервер вернул бы нам только те строки, где найден шаблон:

SELECT vcFamil
FROM tbPeoples
WHERE vcFamil LIKE '%О_О%'

Если использовать функцию PATINDEX, то в результат попадут все строки (мы не ограничиваем вывод в секции WHERE), но там где в фамилии нет шаблона, в соответствующей строке будет стоять ноль, а там где есть, будет стоять 1. Посмотрим на пример результата выполнения запроса с использованием функции PATINDEX:

vcFamil                             Ind         
----------------------------------------------- 
ПОЧЕЧКИН                            0
ПЕТРОВ                              0
СИДОРОВ                             4
КОНОНОВ                             2
СЕРГЕЕВ                             0

В данном примере шаблон ‘%О_О%’ присутствует в фамилии Сидоров. Начиная с четвертого символа идут буквы “оро”.

REPLACE

Функция replace позволяет найти в значении поля подстроку и заменить ее на новое значение. У этой функции три параметра:

  1. Строка, в которой нужно искать подстроку;
  2. Подстрока, которую ищем;
  3. Значение, которое нужно подставить.

Посмотрим пример использования этой функции:

SELECT vcFamil, REPLACE(vcFamil, 'оро', 'аро') AS Ind
FROM tbPeoples
WHERE PATINDEX('%О_О%', vcFamil)>0

Мы выбираем из таблицы два поля: фамилию и результат функции REPLACE. Функция ищет в поле “vcFamil” строку “оро” и заменяет ее на строку “аро”. Чтобы лучше было понятно, посмотрим на результат работы функции:

vcFamil                      Ind                                                                                                                                                                                                                                                              
----------------------------------------------
СИДОРОВ                      СИДароВ
КОНОНОВ                      КОНОНОВ
КОРОВА                       КароВА
МОЛОТКОВ                     МОЛОТКОВ
САДОВОДОВ                    САДОВОДОВ
СОДОРОЧКИН                   СОДароЧКИН

(6 row(s) affected)

В первой колонке показана фамилия из таблицы, а во второй колонке можно увидеть модифицированный с помощью функции REPLACE вариант. Я думаю, что все понятно и без лишних комментариев.

REPLICATE

С помощью функции REPLICATE можно размножать строку. У функции два параметра:

  1. Строка или имя поля, которое нужно вывести несколько раз;
  2. Количество необходимых повторений

Переходим к примеру. Следующий запрос выводит в результирующий набор дважды значение поля фамилии:

SELECT REPLICATE(vcFamil, 2) 
FROM tbPeoples

В результате мы увидим нечто подобное:

ПОЧЕЧКИНПОЧЕЧКИН
ПЕТРОВПЕТРОВ
СИДОРОВСИДОРОВ
КОНОНОВКОНОНОВ
СЕРГЕЕВСЕРГЕЕВ
ВАСИЛЬЕВВАСИЛЬЕВ
...

В данном примере мало полезного смысла, но функция не совсем бесполезна. Например, вы хотите нарисовать длинную двойную полоску. Можно нажать клавишу равенства и ждать, когда появится на экране полоска нужной длины, а можно просто клонировать знак равенства нужное количество раз. Следующий пример клонирует знак 50 раз:

SELECT REPLICATE('=', 50)

Результат:

==================================================

Красиво? А главное удобно в управлении.

REVERSE

Пару раз я встречался с необходимостью перевернуть строку задом наперед, и в этом мне помогла функция REVERSE. Ей нужно передать строку и результатом будет та же строка, только буквы будут идти в обратном порядке. Например, следующий запрос выводит все фамилии задом наперед:

SELECT REVERSE(vcFamil) 
FROM tbPeoples

В реальных приложениях полностью строку вы будете менять достаточно редко, а вот часть строки может меняться. Например, в следующем запросе в фамилии меняются местами первые два символа:

SELECT REPLACE(vcFamil, 
               LEFT(vcFamil, 2), 
               REVERSE(LEFT(vcFamil, 2))
               )
FROM tbPeoples

Пример достаточно интересен тем, что лишний раз показывает, как использовать уже известные нам функции работы со строками. В результирующем наборе отображается результат работы функции REPLACE. Функции нужно передать:

  1. Название поля, где хранится фамилия;
  2. Первые два символа. Для получения первых двух символов используем уже знакомую нам функцию LEFT;
  3. В качестве строки, которая должна будет поставлена вместо первых двух символов фамилии, выступают те же два символа, только перевернутые.

SPACE

С помощью функции SPACE можно создавать пробелы. В качестве единственного параметра нужно указать число, которое определяет количество возвращаемых пробелов. Работа функции идентична REPLICATE, если в качестве клонируемого символа указать пробел.

Допустим, что нам нужно вывести на экран поля фамилию и имя, разделенные 5-ю пробелами. Можно сделать так:

SELECT vcFamil+'     '+vcName
FROM tbPeoples

А можно воспользоваться функцией SPACE:

SELECT vcFamil+SPACE(5)+vcName
FROM tbPeoples

Зачем нужна функция, когда можно воспользоваться без нее? Допустим, что вам нужно использовать 5 пробелов в нескольких местах большого сценария. Все легко решается без функций, но в последствии оказалось, что количество пробелов должно быть не 5, а 10. Придется пересматривать весь сценарий и корректировать пробелы. А если бы мы использовали SPACE в сочетании с переменными, то проблема решилась бы намного проще.

Рассмотрим пример, в котором множественные пробелы используются дважды и для задания количества используется переменная:

DECLARE @sp int
SET @sp=10

SELECT vcFamil+SPACE(@sp)+vcName+SPACE(@sp)+vcSurName
FROM tbPeoples

Теперь, достаточно только изменить значение переменной, и количество пробелов изменено во всем сценарии. А главное – что количество пробелов может быть определено динамически, на основе запросов к таблице.

STR

С помощью функции STR можно форматировать дробные числа в строку. Чем это отличается от преобразования типов? Тип остается тем же, а на экран мы выводим строку в нужном виде. Функции нужно передать три параметра:

  1. Дробное число, которое нужно форматировать;
  2. Общее количество символов, включая числа до и после запятой, пробелы и знак;
  3. Количество знаков после запятой.

Допустим, что нам нужно вывести название и цену товара. Но цена имеет тип money, который содержит слишком большое количество нулей. Чтобы избавиться от лишних чисел после запятой и получить строку, можно сначала привести тип money к типу number(10, 2), а потом результат привести к строке. Но можно решить все одной командой форматирования STR:

SELECT [Название товара], STR(Цена, 10, 2)
FROM Товары

Выполните этот запрос и обратите внимание, что второе поле (отформатированная цена) выровнена вправо:

Название товара                                               
-------------------------------------------------- ---------- 
КАРТОФЕЛЬ                                               13.60
Сок                                                     23.00
Шоколад                                                 25.00
Хлеб                                                     6.00
Сок                                                     18.40
...

Выравнивание происходит из-за второго параметра – числа 10. Мы задали общее число символов, и выравнивание будет происходить по правой позиции указанного значения. Если второй параметр равен 10, а число состоит из 4 символов, то в начало результирующей строки будет добавлено 6 пробелов. Учитывайте это, при использовании функции STR.

STUFF

Функция STUFF позволяет вставить строку в определенную позицию другой строки. У этой функции четыре параметра:

  1. Строка, которую нужно изменить;
  2. Позиция, в которую должна произойти вставка;
  3. Количество удаляемых символов;
  4. Вставляемая строка.

Длина вставляемой строки не обязательно должна быть равна значению из 3-го параметра. Во время выполнения, функция сначала удаляет определенное количество символов, начиная с позиции из второго параметра, а затем вставляет новую строку.

Рассмотрим пример, в котором цена вставляется в поле названия товара, начиная с первой позиции, не удаляя ни одного из символов:

SELECT STUFF([Название товара], 1, 0, STR(Цена, 10, 2)+' ')
FROM Товары

Результат работы функции будет следующим:

--------------------------------------------
     13.60 КАРТОФЕЛЬ
     23.00 Сок
     25.00 Шоколад
      6.00 Хлеб
     18.40 Сок
     12.00 Молоко
      6.00 Хлеб
...

На этом примере более наглядно видно, что вставляемая цена выравнивается вправо. Так как мы указали в функции STR количество символов равное 10, то вставляется не реальный размер цены, а именно 10 символов.

Попробуйте увеличить третий параметр до 1. В этом случае, первый символ в названии товара будет удален, а вместо него будет вставлена цена.

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