Строковые функции SQL. Функции Transact-SQL Символьные функции sql


Below is a full list of the string functions taken from BOL:

ASCII NCHAR SOUNDEX
CHAR PATINDEX SPACE
CHARINDEX REPLACE STR
DIFFERENCE QUOTENAME STUFF
LEFT REPLICATE SUBSTRING
LEN REVERSE UNICODE
LOWER RIGHT UPPER
RTRIM RTRIM

Let"s start from two reciprocally related functions - ASCII and CHAR:

The ASCII function returns an ASCII code value of the leftmost character of a character expression, being a function argument.

Here is an example of the way to determine how many different letters which the names of the ships in the Ships table start from are:

SELECT COUNT(DISTINCT ASCII(name)) FROM Ships

Result is 11. To find out what these letters are, we can use CHAR function that returns a character by a known ASCII code value (from 0 to 255):

SELECT DISTINCT CHAR(ASCII(name)) FROM Ships ORDER BY 1

We should note that the identical result can be got simpler using one more function - LEFT that has the following syntax:

LEFT (<character_expression >, <integer_expression >)

and returns the part of a character string starting at a specified number of characters from the left. So,

SELECT DISTINCT LEFT(name, 1) FROM Ships ORDER BY 1

And this is the way to get the table of codes of all alphabetical characters:

SELECT CHAR(ASCII("a")+ num-1) letter, ASCII("a")+ num - 1 FROM

(SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
CROSS JOIN
CROSS JOIN
) x
WHERE ASCII("a")+ num -1 BETWEEN ASCII("a") AND ASCII("z")

For those who are unaware of generating of numerical sequence I refer to the corresponding article .

It is known that code values of lowercase letters and capital letters differ. That"s why in order to get the whole set without rewriting above query; it will be enough to write up the identical code to aforesaid:

UNION
SELECT CHAR(ASCII("A")+ num-1) letter, ASCII("A")+ num - 1
FROM
SELECT 5*5*(a-1)+5*(b-1) + c AS num FROM
(SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
CROSS JOIN
(SELECT 1 b UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) y
CROSS JOIN
(SELECT 1 c UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) z
) x
WHERE ASCII("A")+ num -1 BETWEEN ASCII("A") AND ASCII("Z")

Now let"s consider the task of searching a substring in a string expression. The two functions can be used for this: CHARINDEX and PATINDEX . They both return a starting position (a position of the first character of a substring) of a substring in a character string. The function CHARINDEX has the following syntax:

CHARINDEX (string_expression , target_expression [ , start_location ] )

Here an optional integer parameter start_location defines a position in a string_expression , where searching a target_expression starts from. If this argument is omitted, a searching starts from the beginning of a string_expression . For example, the query

SELECT name FROM Ships WHERE CHARINDEX("sh", name) > 0

will output the ships that has the sequence of characters "sh" in its names. Here we use the fact that if a substring to be found is not found, the function CHARINDEX returns 0. The result of executing the query will contain the following ships:

name
Kirishima
Musashi
Washington

We should note that if a target_expression or string_expression is NULL, the result of the function is also NULL.

The next example determines the positions of the first and second occurrences of the character "a" in the name of the ship "California"

SELECT CHARINDEX("a",name) first_a,
CHARINDEX("a", name, CHARINDEX("a", name)+1) second_a

Pay attention that in determining of the second occurrence the starting position, used in function, is the position of a character next to the first "a" - CHARINDEX("a", name)+1. The propriety of the result - 2 and 10 - can be easily checked.

The function PATINDEX has the following syntax:

PATINDEX ("%pattern%" , string_expression )

The main distinction of this function from CHARINDEX is that a search string may contain wildcard characters - % and _. Leading and ending characters "%" are required. For, example, usage of this function in the first example will look like

SELECT name FROM Ships WHERE PATINDEX("%sh%", name) > 0

And there"s the way to find the names of the ships that contain the sequence of three characters, first and last of which is "e":

SELECT name FROM Ships
WHERE PATINDEX("%e_e%", name) >0

The result of executing of this query looks like this:

name
Revenge
Royal Sovereign

The function RIGHT that complements LEFT returns a specified number of characters from the right of a character expression:

RIGHT(<character_expression >,<integer_expression >)

Here is, for example, the way to determine the names of the ships that start and end with the same letter:

SELECT name FROM Ships
WHERE LEFT(name, 1) = RIGHT(name, 1)

The thing that we got an empty resulting set means that such ships are absent in our database. Let"s take a combination - a class and a name of a ship.

The combining of two string values into one is called concatenation , and in the SQL Server sign "+" is used for this operation ("||" in standard). So,

SELECT * FROM (
) x

Here we separate by space the class and the name of a ship. Besides, in order not to repeat the whole construction in the function argument, we use a subquery. The result will look like this:

cn
Iowa Missouri
North Carolina Washington

And what if a string expression will contain only one character? The query will output it. You can easily check it by writing

SELECT * FROM (
SELECT class +" "+ name AS cn FROM Ships
UNION ALL SELECT "a" as nc
) x
WHERE LEFT(cn, 1)=RIGHT(cn, 1)

In order to exclude this case, one more useful function LEN(string_expression ) can be used. It returns the number of characters in a string. Let"s bound by the case, when the number of characters is greater than one:

SELECT * FROM (
SELECT class +" "+ name AS cn FROM Ships
UNION ALL SELECT "a" as nc
) x
WHERE LEFT(cn, 1)=RIGHT(cn, 1) AND LEN(cn)>1

There are tasks on the website that require to normalize (find maximum etc.) in a numerical order a values represented in a string format, for example, a seat number in a plane ("2d") or a speed of CD ("24x"). The problem lies in a fact that the text sorts like this (ascending)

11a
1a
2a

SELECT "1a" AS place
UNION ALL SELECT "2a"
UNION ALL SELECT "11a"
ORDER BY 1

If the sorting of places in order of rows increase is required, the order must be like this:

1a
2a
11a

In order to get such an order, the sorting by a numeric values in text is needed. I offer the following algorithm:
1. Extract a number from the string.
2. Convert it to a numeric format.
3. Perform a sorting by a converted value.

As we know that there"s only one letter in the string, and to extract a number we can use the following construction that doesn"t depend on a number of numerals in a seat number:

LEFT(place, LEN(place)-1)

If we just bound by this, we"ll get

place
1a
11a
2a

Converting to a numeric format may look like the following:

CAST (LEFT(place, LEN(place)-1) AS INT)

Now we should just perform a sorting

SELECT * FROM (
SELECT "1a" AS place
UNION ALL SELECT "2a"
UNION ALL SELECT "11a"
) x ORDER BY CAST(LEFT(place, LEN(place)-1) AS INT)

As required to proof.

Previously we used the LEFT function to extract a number from a string expression, because we knew a priori how many characters should be removed from the right (one). And what if we should extract a string from a substring not by the known position of a character, but by a character itself? For example, extract all the characters before the first letter "x" (a value of CD speed).

In this case we can also use the previously considered CHARINDEX function that allows us to determine the unknown position of the character:

SELECT model, LEFT(cd, CHARINDEX("x", cd) -1) FROM PC

SUBSTRING function

SUBSTRING (<expression > ,<start >,<length >)

This function allows us to extract from an expression its part of a specified length, starting from a specified initial position. Expression may be a character or a binary string, and also can have a text or image type. For example, if we need to get 3 characters in a ship name, starting from the 2 nd character, then it"s not quite easy to do it without the SUBSTRING function. And so we write:

SELECT name, SUBSTRING(name, 2, 3) FROM Ships

In case we need to extract all the characters, starting from the certain, we also can use this function. For example,

SELECT name, SUBSTRING(name, 2, LEN(name)) FROM Ships

will give us all the characters in the names of the ships, starting from the second letter in the name. Pay attention that in order to specify the number of characters to extract I used the LEN(name) function that returns a number of characters in the name. It"s clearly that forasmuch as I need the characters, starting from the second, its number will be less than the whole number of the characters in the name. But it doesn"t cause an error, because if a specified number of characters exceed a permissible number, all the characters until the end of a string will be extracted. That is why I take it with a reserve sparing myself the calculations.

REVERSE function

This function reverses a string, just like reading it from the right to left. That is the result of the query

SELECT REVERSE("abcdef")

will be "fedcba". In case of the absence of the RIGHT function in the language the query

SELECT RIGHT("abcdef",3)

can be equally replaced with the query

SELECT REVERSE(LEFT(REVERSE("abcdef"),3))

I see the profit of this function in the following. Let we need to determine a position not the first, but the last occurrence of any character (or a sequence of characters) in a character string.

Let"s remind an example, where we were determining the position of the first character "a" in the name of the ship "California":

SELECT CHARINDEX("a", name) first_a
FROM Ships WHERE name="California"

Now let"s determine the position of the last occurrence of the character "a" in this name. The function

CHARINDEX("a", REVERSE(name))

will allow us to find this position, but from the right. In order to get the position of this character, but from the left, it"s enough to write

SELECT LEN(name) + 1 - CHARINDEX("a", REVERSE(name)) first_a
FROM Ships WHERE name="California"

REPLACE function

REPLACE (<string_expression1 > , <string_expression2 > , <string_expression3 >)

This function replaces in the string_expression1 all the occurrences of the string_expression2 with the string_expression3 . This function is absolutely helpful in UPDATE operators, if we should change the content of the column. For example, let we are needed to replace all the spaces with the hyphen in the names of the ships. Then we can write

UPDATE Ships
SET name = REPLACE(name, " ", "-")

(This example you can perform on the page with the DML exercises, where the questions on updating the data are admitted)

However this function can also find its appliance in more non-trivial cases. Let"s determine how many times the letter "a" is used in a name of a ship. The idea is quite easy: let"s replace every searching letter with any two characters, and after that we"ll calculate the difference of lengths of the string we got and the source string. So,

SELECT name, LEN(REPLACE(name, "a", "aa")) - LEN(name) FROM Ships

And what if we need to determine the number of occurrences of a random sequence of characters that, say, we get as a parameter of a stored procedure? In this case we should complement the used above algorithm with the division on a number of a characters in a sequence:

DECLARE @str AS VARCHAR(100)
SET @str="ma"
SELECT name, (LEN(REPLACE(name, @str, @str+@str)) - LEN(name))/LEN(@str) FROM Ships

Here in order to double the number of searching characters the concatenation @str+@str was applied. However for this effect we can use one more function - REPLICATE that repeats the first argument so many times as it specified by the second argument.

SELECT name, (LEN(REPLACE(name, @str, REPLICATE(@str, 2))) - LEN(name))/LEN(@str) FROM Ships

That is we repeat twice the substring stored in the variable @str.

If we need to replace in a string not a certain sequence of characters, but a specified number of characters, starting from some position, it"s simpler to use the STUFF function:

STUFF (<character_expression1 > , <start > , , <character_expression2 >)

This function replaces a substring with length of length that starts from the start position in the character_expression1 with the character_expression2 .

The example. Change the name of a ship: append "_" (underscore) and a launching year after the first 5 characters. If there is less than 5 characters in the name, complement it with the spaces.

This task can be solved with many different functions. We"ll try to do it with the STUFF function.

In the first approach we"ll write (bounding with the select query):

SELECT name, STUFF(name, 6, LEN(name), "_"+launched) FROM Ships

I use LEN(name) as the third argument (number of characters to replace), because I should replace all the characters until the end of the string, and that"s why I take it with a reserve - the original number of characters in the name. But this query will still return an error. And the question is not in the third argument, but in the forth, where the concatenation of the string constant and the integer column is performing. This is the type conversion error. In order to convert a number to its string representation we may use one more built-in function - STR :

STR (<float_expression > [ , <length > [ , <decimal > ] ])

Under this conversion the round-up is being worked, and a length specifies a length of the resulting string. For example,

STR(3.3456, 5, 1) 3.3
STR(3.3456, 5, 2) 3.35
STR(3.3456, 5, 3) 3.346
STR(3.3456, 5, 4) 3.346

Take note, that if have got string view of the number is less than the specified length, the leading spaces are added. If the result is greater than the specified length, the fractional part is being truncated (with the round-up); in case there is an integer value we get the corresponding number of the asterisks "*".

STR(12345,4,0) ****

By the way, default length is 10 symbols. Keeping in mind that a year is represented by four numbers, we will write

SELECT name, STUFF(name, 6, LEN(name), "_"+STR(launched, 4)) FROM Ships

Everything is almost right. The case is rested to consider, when the number of symbols in the name is less than 6, as in this case the function STUFF gives NULL. Well, we will have to be on the rack to the end, which is connected with using this function in this example, on the way applying one more string function.

We"ll add the trailing blanks for the name`s length being knowingly more than 6. There is a special SPACE function for that

SPACE(<number_of_blanks >):

SELECT name, STUFF(name + SPACE(6), 6, LEN(name), "_"+STR(launched,4)) FROM Ships

LTRIM and RTRIM functions

LTRIM (<character_expression >)

RTRIM (<character_expression >)

cut accordingly the leading and trailing blanks of the string expression, which is being converted by default to the VARCHAR type.

Let us need to build such a string: passenger`s name_passenger`s identifier for every record from the Passenger table. If we write

SELECT name + "_" + CAST(id_psg AS VARCHAR) FROM Passenger,

we will get in the result something like:

It is connected with the fact that the column name has the type CHAR (30). The short string is added with the blanks for this type to the specified dimension (we have 30 symbols). The function RTRIM will help us here:

SELECT RTRIM(name) + "_" + CAST(id_psg AS VARCHAR) FROM Passenger

LOWER and UPPER functions

LOWER(<character_expression >)

UPPER(<character_expression >)

convert all the characters of the argument accordingly to the lower and upper register. These functions turn out to be useful in comparison with the registerdepended strings.

A pair of the interesting functions SOUNDEX and DIFFERENCE

SOUNDEX(<character_expression >)

DIFFERENCE (<character_expression_1 >, <character_expression_2 >)

allow us to determine the similar-sounding of words. SOUNDEX returns a four-character code to evaluate the similarity, but DIFFERENCE just properly evaluates the similarity of two comparing character strings. Being that these functions do not support Cyrillic, I refer interested to BOL for the examples of its usage.

In conclusion we will adduce some functions and a few examples of the Unicode usage:

UNICODE function

UNICODE (<ncharacter_expression >)

returns the Unicode value for the first character of the input expression.

NCHAR function

NCHAR (<integer >)

returns a character with the given integer Unicode value. A few examples:

SELECT ASCII("а"), UNICODE("а")

Returns the ASCII-code value and the Unicode value of the Russian letter "а": 224 and 1072.

SELECT CHAR(ASCII("а")), CHAR(UNICODE("а"))

We try to recover a symbol by its code value. We get "а" and NULL. The NULL-value returns because the 1072 code value is absent in the usual code table.

SELECT CHAR(ASCII("а")), NCHAR(UNICODE("а"))

Now it"s all right, "a" in both cases.

SELECT NCHAR(ASCII("а"))

will give "a", because the Unicode value 224 exactly corresponds to this letter.

» Given examples here can be done directly on the website by selecting the check box “Without checking” on the page with SELECT exercises .

Основные строковые функции и операторы предоставляют разнообразные возможности и возвращают в качестве результата строковое значение. Некоторые строковые функции являются двухэлементными, что означает, что они могут работать одновременно с двумя строками. Стандарт SQL 2003 поддерживает строковые функции.

Оператор конкатенации

В SQL 2003 определяется оператор конкатенации (||), который соединяет две отдельные строки в одно строковое значение.

DB2 платформа

Платформа DB2 поддерживает оператор конкатенации SQL 2003, а также его синоним -функцию CONCAT.

MySQL платформа

Платформа MySQL поддерживает функцию CONCATQ - синоним оператора конкатенации SQL 2003.

Oracle и PostgreSQL

Платформы PostgreSQL и Oracle поддерживают оператор конкатенации SQL 2003 в виде двойной вертикальной черты.

SQL Server платформа

Платформа SQL Server использует знак плюса (+) в качестве синонима оператора конкатенации SQL 2003. В SQL Server есть системный параметр CONCAT_NULL_YIELDS_NULL, который регулирует поведение системы, если при конкатенации строковых значений встречаются значения NULL.

/* Синтаксис SQL 2003 */

stringl || string2 || string3

string1string2string3

/* Для MySQL */

CONCAT("stringl", "string2")

Если любое из соединяемых значений - пустое, то возвращается пустая строка. Кроме того, если в конкатенации принимает участие числовое значение, оно неявно преобразуется в строковое.

SELECT CONCAT("My ", "bologna ", "has ", "a ", "first ", "name…");

My bologna has a first name

SELECT CONCAT("My ", NULL, "has ", "first ", "name…");

CONVERT и TRANSLATE

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

Функция TRANSLATE переводит строковое значение из одного набора символов в другой. Так, функцию TRANSLATE можно использовать для преобразования значения из набора символов English в набор символов Kanji (японский) или Cyrillic (русский). Сам перевод уже должен существовать - либо заданный по умолчанию, либо созданный при помощи команды CREATE TRANSLATION.

Синтаксис SQL 2003

CONVERT (символьное_значение USING имя_символьного_преобразования)

TRANSLATE(символьное_значение USING имя_перевода)

Функция CONVERT преобразует символьное значение к набору символов с именем, указанным в параметре имя_символьного преобразования. Функция TRANSLATE преобразует символьное значение к набору символов, указанному в имени_перевода.

Среди рассматриваемых платформ только Oracle поддерживает функции CONVERT и TRANSLATE в том виде, в каком они определяются в стандарте SQL 2003. Реализация функции TRANSLATE в Oracle очень сходна с SQL 2003, но не идентична ему. В этой реализации функция принимает только два аргумента и производит перевод только между набором символов базы данных и набором символов с поддержкой национального языка.

Реализация функции CONV в MySQL только переводит числа с одного основания в другое. А вот в SQL Server реализация функции CONVERT весьма богата возможностями и изменяет тип данных для выражения, но во всех прочих своих аспектах она отличается от функции CONVERТстандарта SQL 2003. Платформа PostgreSQL не поддерживает функцию CONVERT, а реализация функции TRANSLATE преобразует все вхождения символьной строки в любую другую символьную строку.

DB2

Платформа DB2 не поддерживает функцию CONVERT, а поддержка функции TRANSLATE не соответствует стандарту ANSI. Функция TRANSLATE используется для преобразования подстрок и, как исторически сложилось, является синонимом функции UPPER, поскольку функция UPPER только недавно была добавлена в DB2. Если функция TRANSLATE используется в DB2 с единственным аргументом в виде символьного выражения, то результатом будет та же строка, преобразованная в верхний регистр. Если функция используется с несколькими аргументами, например TRANSLATE(ucmo4HUK, замена, совпадение), то функция преобразует все символы в источнике, которые также есть в параметре совпадение. Каждый символ в источнике, который находится в том же положении, что в параметре совпадение, будет заменен символом из параметра замена. Ниже приводится пример.

TRANSLATE("Hello, World! ") "HELLO; WORLD!"

TRANSLATE("Hello, World1", "wZ", "1W") "Hewwo, Zorwd1

MySQL

Платформа MySQL не поддерживает функции TRANSLATE и CONVERT.

Oracle

Платформа Oracle поддерживает следующий синтаксис функций CONVERT и TRANSLATE.

В реализации Oracle функция CONVERT возвращает текст символьного значения, преобразованный в целевой_набор_символов. Параметр символьное_значение - это строка, которую нужно преобразовать, параметр целевой_набор_символов - это название набора символов, в который нужно преобразовать строку, а параметр исходный _набор символов - это набор символов, в котором строковое значение изначально хранилось.

Функция TRANSLATE в Oracle соответствует синтаксису ANSI, но вы можете выбирать только один из двух наборов символов: набор символов базы данных (CHARJCS) и набор символов с поддержкой национального языка (NCHARJZS).

В Oracle также поддерживается другая функция, которая также называется TRANSLATE (без использования ключевого слова USING). Эта функция TRANSLATE никак не связана с преобразованием наборов символов.

Названия целевого и исходного наборов символов можно передавать либо в виде строковых констант, либо в виде ссылки на столбец таблицы. Обратите внимание, что при преобразовании строки в набор символов, в котором отображаются не все преобразуемые символы, можно подставлять символы-заменители.

Oracle поддерживает несколько общих наборов символов, к которым относятся наборы US7ASCII, WE8DECDEC. WE8HP, F7DEC, WE8EBCDIC500, WE8PC850u WE8ISO8859PI. Например:

SELECT CONVERT("Gro2", "US7ASCII", "WE8HP") FROM DUAL;

PostgreSQL

Платформа PostgreSQL поддерживает инструкцию CONVERT стандарта ANSI, а преобразования здесь можно определять при помощи команды CREATE CONVERSION. Реализация функции TRANSLATE в PostgreSQL предоставляет расширенный набор функций, которые позволяют преобразовать любой текст в другой текст в пределах указанной строки.

TRANSLATE (символьная строка, из_текста, в_текст)

Вот несколько примеров:

SELECT TRANSLATE("12345abcde", "5а", "XX"); "1234XXbcde" SELECT TRANSLATE(title, "Computer", "PC") FROM titles WHERE type="Personal_computer" SELECT CONVERT("PostgreSQL" USING iso_8859_1_to_utf_8) "PostgreSQL"

SQL Server

Платформа SQL Server не поддерживает функцию TRANSLATE. Реализация функции CONVERT в SQL Server не соответствует стандарту SQL 2003. Эта функция в SQL Server эквивалентна функции CAST.

CONVERT (тип_данных[(длина) | (точность, масштаб)], выражение, стиль])

Предложение стиль используется для определения формата преобразования даты. За дополнительной информацией обращайтесь к документации SQL Server. Ниже приводится пример.

SELECT title, CONVERT(char(7), ytd_sales) FROM titles ORDER BY title GO

В другие. Она имеет следующий синтаксис:

CONV(число,N,M)

Аргумент число находится в системе счисления с основанием N. Функция переводит его в систему счисления с основанием M и возвращает значение в виде строки.

Пример 1

Следующий запрос переводит число 2 из десятичной системы счисления в двоичную:

SELECT CONV(2,10,2);

Результат: 10

Для перевода числа 2E из шестнадцатиричной системы в десятичную требуется запрос:

SELECT CONV("2E",16,10);

Результат: 46

Функция CHAR() переводит ASCII-код в строки. Она имеет следующий синтаксис:

CHAR(n1,n2,n3..)

Пример 2

SELECT CHAR(83,81,76);

Результат: SQL

Следующие функции возвращают длину строки:

  • LENGTH(строка);
  • OCTET_LENGTH(строка);
  • CHAR_LENGTH(строка);
  • CHARACTER_LENGTH(строка).

Пример 3

SELECT LENGTH("MySQL");

Результат: 5

Иногда бывает полезной функция BIT_LENGTH(строка) , которая возвращает длину строки в битах.

Пример 4

SELECT BIT_LENGTH("MySQL");

Результат: 40

Функции работы с подстроками

Подстрокой обычно называют часть строки. Часто требуется узнать позицию первого вхождения подстроки в строку. Эту задачу в MySQL решают три функции:

  • LOCATE(подстрока, строка [,позиция]);
  • POSITION(подстрока, строка);
  • INSTR(строка, подстрока).

Если подстрока не содержится в строке, то все три функции возвращают значение 0. Функция INSTR() отличается от двух других порядком аргументов. Функция LOCATE() может содержать третий аргумент позиция , который позволяет искать подстроку в строке не с начала, а с указанной позиции.

Пример 5

SELECT LOCATE("Топаз", "открытое акционерное общество Топаз");

Результат: 31

SELECT POSITION("Топаз", "открытое акционерное общество Топаз");

Результат: 31

SELECT INSTR("открытое акционерное общество Топаз",’Топаз’);

Результат: 31

SELECT LOCATE("Топаз", " Завод Топаз и ООО Топаз", 9);

Результат: 20

SELECT LOCATE("Алмаз", "открытое акционерное общество Топаз");

Результат: 0

Функции LEFT(строка, N) и RIGHT(строка, N) возвращают соответственно крайние левые и крайние правые N символов в строке.

Пример 6

SELECT LEFT("СУБД MySQL", 4);

Результат: СУБД

SELECT RIGHT("СУБД MySQL", 5);

Результат: MySQL

Иногда требуется получить подстроку, которая начинается с некоторой заданной позиции. Для этого используются функции:

  • SUBSTRING(строка, позиция, N);
  • MID(строка, позиция, N).

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

Пример 7

SELECT SUBSTRING("СУБД MySQL - одна из самых популярных СУБД", 6,5);

Результат: MySQL

При работе с электронными адресами и адресами сайтов очень полезна функция SUBSTR_INDEX() . Функция имеет три аргумента:

SUBSTR_INDEX(строка, разделитель, N).

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

Пример 8

SELECT SUBSTRING_INDEX("www.mysql.ru",".",2);

Результат: www.mysql

SELECT SUBSTRING_INDEX("www.mysql.ru",".",-2);

Результат: mysql.ru

Функция REPLACE(строка,подстрока1,подстрока2) позволяет заменить в строке все вхождения подстроки1 на подстроку2.

Из книги Реестр Windows автора Климов А

Быстрое завершение работы Windows (Windows NT/2000/XP) Windows NT версии 3.1 и 3.5 позволяла закрыть все процессы за 20 секунд. В Windows NT 3.51 и выше существует возможность определять величину интервала, в течение которого система должна завершить свою работу. Для этого необходимо исправить ключ

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

ГЛАВА 3 Знакомство с SQL Server 2000 В прошлом многие программисты начинали создание приложений баз данных, используя язык Visual Basic и базу данных Microsoft Access с ядром Jet. Как только база данных разрасталась до нескольких тысяч записей или к ее услугам обращались несколько

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

Требования для инсталляции SQL Server 2000 Для инсталляции SQL Server 2000 требуется компьютер с процессором Pentium (или совместимым с ним) с частотой не менее 166 МГц, пространство на жестком диске от 95 до 270 Мбайт (270 Мбайт для типичного варианта инсталляции и 44 Мбайт для Desktop Engine), дисковод

Из книги О чём не пишут в книгах по Delphi автора Григорьев А. Б.

Установка SQL Server 2000 После выбора компьютера с необходимой конфигурацией можно перейти к установке. В целом процесс установки SQL Server 2000 очень прост, за исключением следующих особенностей: он длится довольно долго; в процессе установки задается очень много на первый

Из книги Справочник по PHP автора

Основы работы с SQL Server 2000 После установки и запуска SQL Server необходимо выполнить следующие действия, прежде чем приступить к извлечению или сохранению данных: создать одну или несколько баз данных; создать таблицы в базе данных; создать представления и хранимые

Из книги XSLT автора Хольцнер Стивен

Функции для работы с массивами В табл. П2.17 приведены функции, с помощью которых можно создавать новые массивы и получать сведения об уже имеющихся.Таблица П2.17. Функции для работы с массивами Функция Описание Array(arglist) Возвращает значение типа Variant, которое является

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

3.3. Тонкости работы со строками В этом разделе мы рассмотрим некоторые тонкости работы со строками, которые позволяют лучше понять, какой код генерирует компилятор при некоторых, казалось бы, элементарных действиях. Не все приведенные здесь примеры работают не так, как

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Функции XPath для работы со строками В XSLT доступны следующие функции XPath для работы со строками: concat(string string1, string string2,...). Возвращает конкатенацию (объединение) всех переданных ей строк; contains(string string1, string string2). Возвращает истину, если первая строка содержит (contains) вторую

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

23.2.2. Функции для работы с памятью Функции для работы с памятью библиотеки Glib выполняют те же действия, что и соответствующие им функции языка С. Вот их прототипы:gpointer g_malloc(gulong size);gpointer g_realloc(gpointer mem, gulong size);void g_free(gpointer

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

Из книги автора

13. Символьные строки и функции над строками СИМВОЛЬНЫЕ CTРOKИИНИЦИАЛИЗАЦИЯ СИМВОЛЬНЫХ СТРОКВВОД-ВЫВОД СТРОКИСПОЛЬЗОВАНИЕ ФУНКЦИЙ, РАБОТАЮЩИХ CO CТРОKAMИАРГУМЕНТЫ КОМАНДНЫХ

Из книги автора

ФУНКЦИИ, РАБОТАЮЩИЕ СО СТРОКАМИ Большинство библиотек языка Си снабжено функциями, работающими со строками. Рассмотрим четыре наиболее полезных и распространенных: strlen(), strcat(), strcmp() и strcpy(). Мы уже применяли функцию strlen(), которая находит длину строки.

Из книги автора

Из книги автора

Подпрограммы для работы с символами и строками function Chr(a: byte): char; Преобразует код в символ в кодировке Windows function ChrUnicode(a: word): char; Преобразует код в символ в кодировке Unicode function OrdUnicode(a: char): word; Преобразует символ в код в кодировке Unicode function UpperCase(ch: char): char;

Из книги автора

Функции для работы с цветом Тип цвета Color является синонимом System.Drawing.Color. function RGB(r,g,b: byte): Color; Возвращает цвет, который содержит красную (r), зеленую (g) и синюю (b) составляющие (r,g и b - в диапазоне от 0 до 255) function ARGB(a,r,g,b: byte): Color; Возвращает цвет, который содержит

Последнее обновление: 29.07.2017

Для работы со строками в T-SQL можно применять следующие функции:

    LEN : возвращает количество символов в строке. В качестве параметра в функцию передается строка, для которой надо найти длину:

    SELECT LEN("Apple") -- 5

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

    SELECT LTRIM(" Apple")

    RTRIM : удаляет конечные пробелы из строки. В качестве параметра принимает строку:

    SELECT RTRIM(" Apple ")

    CHARINDEX : возвращает индекс, по которому находится первое вхождение подстроки в строке. В качестве первого параметра передается подстрока, а в качестве второго - строка, в которой надо вести поиск:

    SELECT CHARINDEX("pl", "Apple") -- 3

    PATINDEX : возвращает индекс, по которому находится первое вхождение определенного шаблона в строке:

    SELECT PATINDEX("%p_e%", "Apple") -- 3

    LEFT : вырезает с начала строки определенное количество символов. Первый параметр функции - строка, а второй - количество символов, которые надо вырезать сначала строки:

    SELECT LEFT("Apple", 3) -- App

    RIGHT : вырезает с конца строки определенное количество символов. Первый параметр функции - строка, а второй - количество символов, которые надо вырезать сначала строки:

    SELECT RIGHT("Apple", 3) -- ple

    SUBSTRING : вырезает из строки подстроку определенной длиной, начиная с определенного индекса. Певый параметр функции - строка, второй - начальный индекс для вырезки, и третий параметр - количество вырезаемых символов:

    SELECT SUBSTRING("Galaxy S8 Plus", 8, 2) -- S8

    REPLACE : заменяет одну подстроку другой в рамках строки. Первый параметр функции - строка, второй - подстрока, которую надо заменить, а третий - подстрока, на которую надо заменить:

    SELECT REPLACE("Galaxy S8 Plus", "S8 Plus", "Note 8") -- Galaxy Note 8

    REVERSE : переворачивает строку наоборот:

    SELECT REVERSE("123456789") -- 987654321

    CONCAT : объединяет две строки в одну. В качестве параметра принимает от 2-х и более строк, которые надо соединить:

    SELECT CONCAT("Tom", " ", "Smith") -- Tom Smith

    LOWER : переводит строку в нижний регистр:

    SELECT LOWER("Apple") -- apple

    UPPER : переводит строку в верхний регистр

    SELECT UPPER("Apple") -- APPLE

    SPACE : возвращает строку, которая содержит определенное количество пробелов

Например, возьмем таблицу:

CREATE TABLE Products (Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL);

И при извлечении данных применим строковые функции:

SELECT UPPER(LEFT(Manufacturer,2)) AS Abbreviation, CONCAT(ProductName, " - ", Manufacturer) AS FullProdName FROM Products ORDER BY Abbreviation