Spec-Zone.ru › DuckDB

Сопоставление шаблонов

DuckDB предоставляет четыре отдельных подхода к сопоставлению шаблонов: традиционный SQL-оператор LIKE, более поздний оператор SIMILAR TO (добавлен в SQL:1999), оператор GLOB и регулярные выражения в стиле POSIX регулярные выражения.

LIKE

Выражение LIKE возвращает true, если строка соответствует заданному шаблону. (Как ожидается, выражение NOT LIKE возвращает false, если LIKE возвращает true, и наоборот. Эквивалентное выражение — NOT (string LIKE pattern).)

Если шаблон не содержит процентов или нижних подчеркиваний, то шаблон представляет только саму строку; в этом случае LIKE действует как оператор равенства. Нижнее подчеркивание (_) в шаблоне соответствует (сопоставляется) любому одиночному символу; знак процента (%) соответствует любой последовательности из нуля или более символов.

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

Некоторые примеры:

SELECT 'abc' LIKE 'abc'; -- true
SELECT 'abc' LIKE 'a%' ; -- true
SELECT 'abc' LIKE '_b_'; -- true
SELECT 'abc' LIKE 'c';   -- false
SELECT 'abc' LIKE 'c%' ; -- false
SELECT 'abc' LIKE '%c';  -- true
SELECT 'abc' NOT LIKE '%c'; -- false

Ключевое слово ILIKE может использоваться вместо LIKE для выполнения нечувствительного к регистру сопоставления в соответствии с активной локалью:

SELECT 'abc' ILIKE '%C'; -- true
SELECT 'abc' NOT ILIKE '%C'; -- false

Для поиска символа, являющегося символом подстановки (% или _), в строке шаблон должен использовать ESCAPE-оператор и символ экранирования, чтобы указать, что символ подстановки должен обрабатываться как буквальный символ, а не как символ подстановки. См. пример ниже.

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

Поиск строк, начинающихся с 'a', затем с буквального знака процента и заканчивающихся 'c':

SELECT 'a%c' LIKE 'a$%c' ESCAPE '$'; -- true
SELECT 'azc' LIKE 'a$%c' ESCAPE '$'; -- false

Нечувствительное к регистру ILIKE с ESCAPE:

SELECT 'A%c' ILIKE 'a$%c' ESCAPE '$'; -- true

Также существуют альтернативные символы, которые могут использоваться в качестве ключевых слов вместо выражений LIKE. Они повышают совместимость с PostgreSQL.

LIKE-стиль PostgreSQL-стиль
LIKE ~~
NOT LIKE !~~
ILIKE ~~*
NOT ILIKE !~~*

SIMILAR TO

Оператор SIMILAR TO возвращает true или false в зависимости от того, соответствует ли его шаблон заданной строке. Он похож на LIKE, за исключением того, что он интерпретирует шаблон с использованием регулярного выражения. Подобно LIKE, оператор SIMILAR TO выполняется только в том случае, если его шаблон соответствует всей строке; это отличается от обычного поведения регулярных выражений, где шаблон может соответствовать любой части строки.

Регулярное выражение — это последовательность символов, являющаяся сокращённым определением набора строк (регулярный набор). Строка соответствует регулярному выражению, если она является членом регулярного набора, описанного регулярным выражением. Как и в случае с LIKE, символы шаблона точно соответствуют символам строки, за исключением специальных символов в языке регулярных выражений — но регулярные выражения используют разные специальные символы, чем LIKE.

Некоторые примеры:

SELECT 'abc' SIMILAR TO 'abc';       -- true
SELECT 'abc' SIMILAR TO 'a';         -- false
SELECT 'abc' SIMILAR TO '.*(b|d).*'; -- true
SELECT 'abc' SIMILAR TO '(b|c).*';   -- false
SELECT 'abc' NOT SIMILAR TO 'abc';   -- false

Также существуют альтернативные символы, которые могут использоваться в качестве ключевых слов вместо выражений SIMILAR TO . Они следуют синтаксису POSIX.

SIMILAR TO-стиль POSIX-стиль
SIMILAR TO ~
NOT SIMILAR TO !~

Глоббинг

DuckDB поддерживает расширение имён файлов, также известное как глоббинг, для обнаружения файлов. Синтаксис глоббинга DuckDB использует символ вопроса (?) в качестве символа подстановки для соответствия любому одиночному символу и звездочку (*) для соответствия нулю или более символам. Кроме того, вы можете использовать синтаксис скобок ([...]) для соответствия любому одиночному символу, содержащемуся в скобках, или диапазону символов, указанному в скобках. Восклицательный знак (!) может использоваться внутри первых скобок для поиска символов, которые не содержатся в скобках. Чтобы узнать больше, посетите страницу “glob (programming)” Wikipedia page.

GLOB

Оператор GLOB возвращает true или false, если строка соответствует шаблону GLOB. Оператор GLOB чаще всего используется при поиске файлов, которые следуют определённому шаблону (например, определённому расширению файла).

Некоторые примеры:

SELECT 'best.txt' GLOB '*.txt';            -- true
SELECT 'best.txt' GLOB '????.txt';         -- true
SELECT 'best.txt' GLOB '?.txt';            -- false
SELECT 'best.txt' GLOB '[abc]est.txt';     -- true
SELECT 'best.txt' GLOB '[a-z]est.txt';     -- true

Синтаксис в квадратных скобках чувствителен к регистру:

SELECT 'Best.txt' GLOB '[a-z]est.txt';     -- false
SELECT 'Best.txt' GLOB '[a-zA-Z]est.txt';  -- true

Оператор ! применяется ко всем символам в квадратных скобках:

SELECT 'Best.txt' GLOB '[!a-zA-Z]est.txt'; -- false

Для отрицания оператора GLOB, отрицайте всё выражение:

SELECT NOT 'best.txt' GLOB '*.txt';        -- false

Три тильды (~~~) также могут быть использованы вместо ключевого слова GLOB.

GLOB-стиль Символьный стиль
GLOB ~~~

Функция glob для поиска имён файлов

Синтаксис сопоставления шаблонов glob также может использоваться для поиска имён файлов с помощью функции таблицы glob. Она принимает один параметр: путь для поиска (который может включать шаблоны glob).

Поиск в текущей директории всех файлов:

SELECT * FROM glob('*');
файл
duckdb.exe
test.csv
test.json
test.parquet
test2.csv
test2.parquet
todos.json

Семантика globbing

Реализация globbing в DuckDB следует семантике Python's glob, а не glob, используемой в оболочке. Отличительной особенностью является поведение конструкции **/: **/⟨filename⟩ не вернёт файл с ⟨filename⟩ в директории верхнего уровня. Например, при наличии файла README.md в директории, следующий запрос находит его:

SELECT * FROM glob('README.md');
файл
README.md

Однако, следующий запрос возвращает пустой результат:

SELECT * FROM glob('**/README.md');

В то же время, globbing в Bash, Zsh и т.д. находит файл с использованием того же синтаксиса:

ls **/README.md
README.md

Регулярные выражения

Поддержка регулярных выражений в DuckDB описана на странице Регулярные выражения.

© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/functions/pattern_matching.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API