2020-03-20 18:20:59 +00:00
# Функции для работы с о строками {#funktsii-dlia-raboty-so-strokami}
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
## empty {#empty}
2017-03-12 17:58:51 +00:00
Возвращает 1 для пустой строки, и 0 для непустой строки.
2020-03-19 15:32:53 +00:00
Тип результата — UInt8.
2017-03-12 17:58:51 +00:00
Строка считается непустой, если содержит хотя бы один байт, пусть даже это пробел или нулевой байт.
Функция также работает для массивов.
2020-03-19 15:32:53 +00:00
## notEmpty {#notempty}
2017-03-12 17:58:51 +00:00
Возвращает 0 для пустой строки, и 1 для непустой строки.
2020-03-19 15:32:53 +00:00
Тип результата — UInt8.
2017-03-12 17:58:51 +00:00
Функция также работает для массивов.
2020-03-19 15:32:53 +00:00
## length {#length}
2017-03-12 17:58:51 +00:00
Возвращает длину строки в байтах (не символах, не кодовых точках).
2020-03-19 15:32:53 +00:00
Тип результата — UInt64.
2017-03-12 17:58:51 +00:00
Функция также работает для массивов.
2020-03-19 15:32:53 +00:00
## lengthUTF8 {#lengthutf8}
Возвращает длину строки в кодовых точках Unicode (не символах), при допущении, что строка содержит набор байтов, являющийся текстом в кодировке UTF-8. Если допущение не выполнено, то возвращает какой-нибудь результат (не кидает исключение).
Тип результата — UInt64.
2020-03-20 18:20:59 +00:00
## char\_length, CHAR\_LENGTH {#char-length}
2020-03-19 15:32:53 +00:00
Возвращает длину строки в кодовых точках Unicode (не символах), при допущении, что строка содержит набор байтов, являющийся текстом в кодировке UTF-8. Если допущение не выполнено, возвращает какой-нибудь результат (не кидает исключение).
Тип результата — UInt64.
2020-03-20 18:20:59 +00:00
## character\_length, CHARACTER\_LENGTH {#character-length}
2020-03-19 15:32:53 +00:00
Возвращает длину строки в кодовых точках Unicode (не символах), при допущении, что строка содержит набор байтов, являющийся текстом в кодировке UTF-8. Если допущение не выполнено, возвращает какой-нибудь результат (не кидает исключение).
Тип результата — UInt64.
## lower, lcase {#lower}
2017-03-12 17:58:51 +00:00
Переводит ASCII-символы латиницы в строке в нижний регистр.
2020-03-19 15:32:53 +00:00
## upper, ucase {#upper}
2017-03-12 17:58:51 +00:00
Переводит ASCII-символы латиницы в строке в верхний регистр.
2020-03-19 15:32:53 +00:00
## lowerUTF8 {#lowerutf8}
Переводит строку в нижний регистр, при допущении, что строка содержит набор байтов, представляющий текст в кодировке UTF-8.
2017-03-12 17:58:51 +00:00
Н е учитывает язык. Т о есть, для турецкого языка, результат может быть не совсем верным.
2020-03-19 15:32:53 +00:00
Если длина UTF-8 последовательности байтов различна для верхнего и нижнего регистра кодовой точки, то для этой кодовой точки результат работы может быть некорректным.
Если строка содержит набор байтов, не являющийся UTF-8, то поведение не определено.
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
## upperUTF8 {#upperutf8}
Переводит строку в верхний регистр, при допущении, что строка содержит набор байтов, представляющий текст в кодировке UTF-8.
2017-03-12 17:58:51 +00:00
Н е учитывает язык. Т о есть, для турецкого языка, результат может быть не совсем верным.
2020-03-19 15:32:53 +00:00
Если длина UTF-8 последовательности байтов различна для верхнего и нижнего регистра кодовой точки, то для этой кодовой точки, результат работы может быть некорректным.
Если строка содержит набор байтов, не являющийся UTF-8, то поведение не определено.
## isValidUTF8 {#isvalidutf8}
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
Возвращает 1, если набор байтов является корректным в кодировке UTF-8, 0 иначе.
2019-04-07 18:58:13 +00:00
2020-03-19 15:32:53 +00:00
## toValidUTF8 {#tovalidutf8}
2019-05-20 14:41:10 +00:00
Заменяет некорректные символы UTF-8 на символ `<60> ` (U+FFFD). В с е идущие подряд некорректные символы схлопываются в один заменяющий символ.
2020-03-20 18:20:59 +00:00
``` sql
2019-05-20 14:41:10 +00:00
toValidUTF8( input_string )
```
Параметры:
2020-04-30 18:19:18 +00:00
- input\_string — произвольный набор байтов, представленный как объект типа [String ](../../sql-reference/functions/string-functions.md ).
2019-05-20 14:41:10 +00:00
Возвращаемое значение: Корректная строка UTF-8.
2020-03-19 15:32:53 +00:00
**Пример**
2019-05-20 14:41:10 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-05-23 12:42:12 +00:00
SELECT toValidUTF8('\x61\xF0\x80\x80\x80b')
2019-05-20 14:41:10 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-05-23 12:42:12 +00:00
┌─toValidUTF8('a<> <61> <EFBFBD> <EFBFBD> b')─┐
│ a<> b │
└───────────────────────┘
2019-05-20 14:41:10 +00:00
```
2019-10-24 14:59:00 +00:00
## repeat {#repeat}
Повторяет строку определенное количество раз и объединяет повторяемые значения в одну строку.
**Синтаксис**
2020-03-20 18:20:59 +00:00
``` sql
2019-10-24 14:59:00 +00:00
repeat(s, n)
```
**Параметры**
2020-04-30 18:19:18 +00:00
- `s` — Строка для повторения. [String ](../../sql-reference/functions/string-functions.md ).
- `n` — Количество повторов. [UInt ](../../sql-reference/functions/string-functions.md ).
2019-10-24 14:59:00 +00:00
**Возвращаемое значение**
2020-03-20 18:20:59 +00:00
Строка, состоящая из повторений `n` раз исходной строки `s` . Если `n` \< 1, то функция вернет пустую строку.
2019-10-24 14:59:00 +00:00
Тип: `String` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-10-24 14:59:00 +00:00
SELECT repeat('abc', 10)
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-10-24 14:59:00 +00:00
┌─repeat('abc', 10)──────────────┐
│ abcabcabcabcabcabcabcabcabcabc │
└────────────────────────────────┘
```
2019-05-20 14:41:10 +00:00
2020-03-19 15:32:53 +00:00
## reverse {#reverse}
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
Разворачивает строку (как последовательность байтов).
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
## reverseUTF8 {#reverseutf8}
2019-05-18 11:30:36 +00:00
2020-03-19 15:32:53 +00:00
Разворачивает последовательность кодовых точек Unicode, при допущении, что строка содержит набор байтов, представляющий текст в кодировке UTF-8. Иначе — что-то делает (не кидает исключение).
2019-05-18 11:30:36 +00:00
2020-03-20 18:20:59 +00:00
## format(pattern, s0, s1, …) {#format}
2020-03-19 15:32:53 +00:00
2020-03-20 18:20:59 +00:00
Форматирует константный шаблон с о строками, перечисленными в аргументах. `pattern` — упрощенная версия шаблона в языке Python. Шаблон содержит «заменяющие поля», которые окружены фигурными скобками `{}` . Всё, что не содержится в скобках, интерпретируется как обычный текст и просто копируется. Если нужно использовать символ фигурной скобки, можно экранировать двойной скобкой `{{ '{{' }}` или `{{ '}}' }}` . Имя полей могут быть числами (нумерация с нуля) или пустыми (тогда они интерпретируются как последовательные числа).
2019-05-18 11:30:36 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-05-18 11:30:36 +00:00
SELECT format('{1} {0} {1}', 'World', 'Hello')
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-05-18 11:30:36 +00:00
┌─format('{1} {0} {1}', 'World', 'Hello')─┐
│ Hello World Hello │
└─────────────────────────────────────────┘
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` sql
2019-05-18 11:30:36 +00:00
SELECT format('{} {}', 'Hello', 'World')
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-05-18 11:30:36 +00:00
┌─format('{} {}', 'Hello', 'World')─┐
│ Hello World │
└───────────────────────────────────┘
```
2020-03-19 15:32:53 +00:00
## concat {#concat}
2019-05-18 11:30:36 +00:00
2020-03-19 15:32:53 +00:00
Склеивает строки, переданные в аргументы, в одну строку без разделителей.
2019-11-11 14:46:08 +00:00
2020-03-20 18:20:59 +00:00
**Cинта кс ис **
2019-11-11 14:46:08 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-11-11 14:46:08 +00:00
concat(s1, s2, ...)
```
**Параметры**
2020-02-02 22:01:57 +00:00
Значения типа String или FixedString.
2019-11-11 14:46:08 +00:00
2020-02-02 22:01:57 +00:00
**Возвращаемое значение**
2019-11-11 14:46:08 +00:00
2020-03-20 18:20:59 +00:00
Возвращает строку, полученную в результате склейки аргументов.
2019-11-11 14:46:08 +00:00
2019-12-26 12:51:48 +00:00
Если любой из аргументов имеет значение `NULL` , `concat` возвращает значение `NULL` .
2019-11-11 14:46:08 +00:00
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-12-26 12:51:48 +00:00
SELECT concat('Hello, ', 'World!')
2019-11-11 14:46:08 +00:00
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-12-26 12:51:48 +00:00
┌─concat('Hello, ', 'World!')─┐
│ Hello, World! │
└─────────────────────────────┘
2019-11-11 14:46:08 +00:00
```
## concatAssumeInjective {#concatassumeinjective}
2020-02-02 22:01:57 +00:00
Аналогична [concat ](#concat ). Разница заключается в том, что вам нужно убедиться, что `concat(s1, s2, ...) → sn` является инъективным, так как это предположение будет использоваться для оптимизации GROUP BY.
2020-03-20 18:20:59 +00:00
Функция называется «инъективной», если она возвращает разные значения для разных аргументов. Или, иными словами, функция никогда не выдаёт одно и то же значение, если аргументы разные.
2019-11-11 14:46:08 +00:00
2020-03-20 18:20:59 +00:00
**Синтаксис**
2019-11-11 14:46:08 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-11-11 14:46:08 +00:00
concatAssumeInjective(s1, s2, ...)
```
**Параметры**
2020-02-02 22:01:57 +00:00
Значения типа String или FixedString.
2019-11-11 14:46:08 +00:00
**Возвращаемые значения**
2020-03-20 18:20:59 +00:00
Возвращает строку, полученную в результате объединения аргументов.
2019-11-11 14:46:08 +00:00
2019-12-26 12:51:48 +00:00
Если любой из аргументов имеет значение `NULL` , `concatAssumeInjective` возвращает значение `NULL` .
2019-11-11 14:46:08 +00:00
**Пример**
2019-12-26 12:51:48 +00:00
Вводная таблица:
2020-03-20 18:20:59 +00:00
``` sql
2019-12-26 12:51:48 +00:00
CREATE TABLE key_val(`key1` String, `key2` String, `value` UInt32) ENGINE = TinyLog
INSERT INTO key_val VALUES ('Hello, ','World',1)('Hello, ','World',2)('Hello, ','World!',3)('Hello',', World!',2)
SELECT * from key_val
```
2020-03-20 18:20:59 +00:00
``` text
2019-12-26 12:51:48 +00:00
┌─key1────┬─key2─────┬─value─┐
│ Hello, │ World │ 1 │
│ Hello, │ World │ 2 │
│ Hello, │ World! │ 3 │
│ Hello │ , World! │ 2 │
└─────────┴──────────┴───────┘
```
2019-11-11 14:46:08 +00:00
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-12-26 12:51:48 +00:00
SELECT concat(key1, key2), sum(value) FROM key_val GROUP BY (key1, key2)
2019-11-11 14:46:08 +00:00
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-11-11 14:46:08 +00:00
┌─concat(key1, key2)─┬─sum(value)─┐
│ Hello, World! │ 3 │
│ Hello, World! │ 2 │
│ Hello, World │ 3 │
└────────────────────┴────────────┘
```
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
## substring(s, offset, length), mid(s, offset, length), substr(s, offset, length) {#substring}
Возвращает подстроку, начиная с байта по индексу offset, длины length байт. Индексация символов — начиная с единицы (как в стандартном SQL). Аргументы offset и length должны быть константами.
## substringUTF8(s, offset, length) {#substringutf8}
2017-03-12 17:58:51 +00:00
2020-03-19 15:32:53 +00:00
Так же, как substring, но для кодовых точек Unicode. Работает при допущении, что строка содержит набор байтов, представляющий текст в кодировке UTF-8. Если допущение не выполнено, то возвращает какой-нибудь результат (не кидает исключение).
## appendTrailingCharIfAbsent(s, c) {#appendtrailingcharifabsent}
2017-03-12 17:58:51 +00:00
Если строка s непустая и не содержит символ c на конце, то добавляет символ c в конец.
2020-03-19 15:32:53 +00:00
## convertCharset(s, from, to) {#convertcharset}
2017-03-12 17:58:51 +00:00
Возвращает сконвертированную из кодировки from в кодировку to строку s.
2018-11-02 19:06:05 +00:00
2020-03-19 15:32:53 +00:00
## base64Encode(s) {#base64encode}
2018-11-02 19:06:05 +00:00
Производит кодирование строки s в base64-представление.
2020-03-19 15:32:53 +00:00
## base64Decode(s) {#base64decode}
2018-11-02 19:06:05 +00:00
Декодирует base64-представление s в исходную строку. При невозможности декодирования выбрасывает исключение
2020-03-19 15:32:53 +00:00
## tryBase64Decode(s) {#trybase64decode}
2018-11-14 09:32:42 +00:00
Функционал аналогичен base64Decode, но при невозможности декодирования возвращает пустую строку.
2020-03-19 15:32:53 +00:00
## endsWith(s, suffix) {#endswith}
2019-09-06 09:07:23 +00:00
Возвращает 1, если строка завершается указанным суффиксом, и 0 в противном случае.
2020-03-19 15:32:53 +00:00
## startsWith(str, prefix) {#startswith}
2019-09-06 09:07:23 +00:00
2019-09-26 11:39:06 +00:00
Возвращает 1, если строка начинается указанным префиксом, в противном случае 0.
2020-03-20 18:20:59 +00:00
``` sql
2019-09-30 07:24:02 +00:00
SELECT startsWith('Spider-Man', 'Spi');
2019-09-26 11:39:06 +00:00
```
**Возвращаемые значения**
2020-03-21 04:11:51 +00:00
- 1, если строка начинается указанным префиксом.
- 0, если строка не начинается указанным префиксом.
2019-09-26 11:39:06 +00:00
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-09-26 11:39:06 +00:00
SELECT startsWith('Hello, world!', 'He');
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-09-26 11:39:06 +00:00
┌─startsWith('Hello, world!', 'He')─┐
│ 1 │
└───────────────────────────────────┘
```
2019-09-06 09:07:23 +00:00
2020-01-05 22:50:16 +00:00
## trim {#trim}
Удаляет все указанные символы с начала или окончания строки.
По умолчанию удаляет все последовательные вхождения обычных пробелов (32 символ ASCII) с обоих концов строки.
**Синтаксис**
2020-03-20 18:20:59 +00:00
``` sql
2020-01-05 22:50:16 +00:00
trim([[LEADING|TRAILING|BOTH] trim_character FROM] input_string)
```
**Параметры**
2020-04-30 18:19:18 +00:00
- `trim_character` — один или несколько символов, подлежащие удалению. [String ](../../sql-reference/functions/string-functions.md ).
- `input_string` — строка для обрезки. [String ](../../sql-reference/functions/string-functions.md ).
2020-01-05 22:50:16 +00:00
**Возвращаемое значение**
Исходную строку после обрезки с левого и (или) правого концов строки.
Тип: `String` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2020-01-05 22:50:16 +00:00
SELECT trim(BOTH ' ()' FROM '( Hello, world! )')
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2020-01-05 22:50:16 +00:00
┌─trim(BOTH ' ()' FROM '( Hello, world! )')─┐
│ Hello, world! │
└───────────────────────────────────────────────┘
```
2019-12-05 10:03:35 +00:00
## trimLeft {#trimleft}
Удаляет все последовательные вхождения обычных пробелов (32 символ ASCII) с левого конца строки. Н е удаляет другие виды пробелов (табуляция, пробел без разрыва и т. д.).
2020-03-20 18:20:59 +00:00
**Синтаксис**
2019-12-05 10:03:35 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2020-01-05 22:50:16 +00:00
trimLeft(input_string)
2019-12-05 10:03:35 +00:00
```
2020-01-05 22:50:16 +00:00
Алиас: `ltrim(input_string)` .
2019-12-05 10:03:35 +00:00
**Параметры**
2020-04-30 18:19:18 +00:00
- `input_string` — строка для обрезки. [String ](../../sql-reference/functions/string-functions.md ).
2019-12-05 10:03:35 +00:00
**Возвращаемое значение**
Исходную строку без общих пробельных символов слева.
Тип: `String` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-12-05 10:03:35 +00:00
SELECT trimLeft(' Hello, world! ')
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-12-05 10:03:35 +00:00
┌─trimLeft(' Hello, world! ')─┐
│ Hello, world! │
└─────────────────────────────────────┘
```
2020-03-20 18:20:59 +00:00
## trimRight {#trimright}
2019-12-05 10:03:35 +00:00
Удаляет все последовательные вхождения обычных пробелов (32 символ ASCII) с правого конца строки. Н е удаляет другие виды пробелов (табуляция, пробел без разрыва и т. д.).
2020-03-20 18:20:59 +00:00
**Синтаксис**
2019-12-05 10:03:35 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2020-01-05 22:50:16 +00:00
trimRight(input_string)
2019-12-05 10:03:35 +00:00
```
2020-01-05 22:50:16 +00:00
Алиас: `rtrim(input_string)` .
2019-12-05 10:03:35 +00:00
**Параметры**
2020-04-30 18:19:18 +00:00
- `input_string` — строка для обрезки. [String ](../../sql-reference/functions/string-functions.md ).
2019-12-05 10:03:35 +00:00
**Возвращаемое значение**
Исходную строку без общих пробельных символов справа.
Тип: `String` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-12-05 10:03:35 +00:00
SELECT trimRight(' Hello, world! ')
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-12-05 10:03:35 +00:00
┌─trimRight(' Hello, world! ')─┐
│ Hello, world! │
└──────────────────────────────────────┘
```
## trimBoth {#trimboth}
Удаляет все последовательные вхождения обычных пробелов (32 символ ASCII) с обоих концов строки. Н е удаляет другие виды пробелов (табуляция, пробел без разрыва и т. д.).
2020-03-20 18:20:59 +00:00
**Синтаксис**
2019-12-05 10:03:35 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2020-01-05 22:50:16 +00:00
trimBoth(input_string)
2019-12-05 10:03:35 +00:00
```
2020-01-05 22:50:16 +00:00
Алиас: `trim(input_string)` .
2019-12-05 10:03:35 +00:00
**Параметры**
2020-04-30 18:19:18 +00:00
- `input_string` — строка для обрезки. [String ](../../sql-reference/functions/string-functions.md ).
2019-12-05 10:03:35 +00:00
**Возвращаемое значение**
Исходную строку без общих пробельных символов с обоих концов строки.
Тип: `String` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-12-05 10:03:35 +00:00
SELECT trimBoth(' Hello, world! ')
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-12-05 10:03:35 +00:00
┌─trimBoth(' Hello, world! ')─┐
│ Hello, world! │
└─────────────────────────────────────┘
```
2020-03-19 15:32:53 +00:00
## CRC32(s) {#crc32}
2019-09-26 11:39:06 +00:00
2019-10-20 20:04:52 +00:00
Возвращает чексумму CRC32 данной строки, используется CRC-32-IEEE 802.3 многочлен и начальным значением `0xffffffff` (т.к. используется реализация из zlib).
2020-03-19 15:32:53 +00:00
Тип результата — UInt32.
2019-10-20 20:04:52 +00:00
2020-03-19 15:32:53 +00:00
## CRC32IEEE(s) {#crc32ieee}
2019-10-20 20:04:52 +00:00
Возвращает чексумму CRC32 данной строки, используется CRC-32-IEEE 802.3 многочлен.
2020-03-19 15:32:53 +00:00
Тип результата — UInt32.
2019-06-17 21:49:37 +00:00
2020-03-19 15:32:53 +00:00
## CRC64(s) {#crc64}
2019-10-20 20:04:52 +00:00
Возвращает чексумму CRC64 данной строки, используется CRC-64-ECMA многочлен.
2020-03-19 15:32:53 +00:00
Тип результата — UInt64.
2019-10-20 20:04:52 +00:00
2020-01-30 10:34:55 +00:00
[Оригинальная статья ](https://clickhouse.tech/docs/ru/query_language/functions/string_functions/ ) <!--hide-->