Функції та оператори
Логічні оператори та оператори порівняння
Звичні логічні оператори все ще доступні:
boolean AND boolean -> boolean
boolean OR boolean -> boolean
NOT boolean -> boolean
SQL використовує тризначну логічну систему з істиною, хибністю і нулем, який представляє собою невідоме.
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Оператори AND і OR є комутативними, тобто ви можете міняти місцями лівий і правий операнди без впливу на результат. Однак не гарантується, що лівий операнд буде обчислено раніше правого.
Оператори порівняння
Доступні звичайні оператори порівняння.
Оператор |
Опис |
|---|---|
|
Менше ніж |
|
Більше ніж |
|
Менше ніж або дорівнює |
|
Більше або дорівнює |
|
Дорівнює |
|
Не дорівнює |
|
Не дорівнює |
Математичні функції та оператори
Математичні оператори і передбачені для багатьох типів PostgreSQL.
Операція |
Опис |
|---|---|
|
Додавання |
|
Унарний плюс (без операції) |
|
Віднімання |
|
Заперечення |
|
Множення |
|
Ділення (для інтегральних типів ділення усікає результат до нуля) |
|
За модулем (залишок); доступний для |
|
Піднесення до степеня |
|
Квадратний корінь |
|
Кубічний корінь |
|
Абсолютне значення |
|
Побітове І |
|
Порозрядне АБО |
|
Побітове виключне АБО |
|
Побітове І |
|
Порозрядний зсув вліво |
|
Порозрядний зсув вправо |
Рядкові функції
Рядки у цьому контексті включають значення типів символ, текст та символьна змінна.
- text || text -> text
З’єднує два рядки.
'Post' || 'greSQL' -> PostgreSQL
- text || anynonarray -> text
- anynonarray || text -> text
Перетворює нестрокове введення у текст, а потім об’єднує два рядки. (Нестроковий ввід не може бути типом масиву, оскільки це створить неоднозначність з операторами масиву
||. Якщо ви хочете об’єднати текстовий еквівалент масиву, перетворіть його у текст явно)'Value: ' || 42 -> Value: 42
- char_length(text) integer
- character_length(text) integer
Повертає кількість символів у рядку.
char_length('josé') -> 4
- lower(text) text
Перетворює рядок у всі регістри нижнього регістру відповідно до правил локалі бази даних.
lower('TOM') -> tom
- ltrim(string text[, characters text]) text
Видаляє найдовший рядок, що містить лише символи (за замовчуванням пробіл) з початку рядка.
ltrim('zzzytest', 'xyz') -> test
- rtrim(string text[, characters text]) text
Видаляє з кінця рядка найдовший рядок, що містить лише символи (за замовчуванням пробіл).
rtrim('testxxzx', 'xyz') -> test
- trim([ LEADING | TRAILING | BOTH ] [ characters text ] FROM string text ) text
Видаляє найдовший рядок, що містить лише символи (за замовчуванням пробіл) з початку, кінця або обох кінців рядка (за замовчуванням BOTH).
trim(both 'xyz' from 'yxTomxx') -> Tom
Зіставлення шаблонів
У PostgreSQL існує три окремі підходи до зіставлення шаблонів: традиційний оператор LIKE, найновіший оператор SIMILAR TO та регулярні вирази у стилі POSIX.
У цьому розділі буде розглянуто лише оператор LIKE.
string LIKE pattern [ESCAPE escape-character]
string NOT LIKE pattern [ESCAPE escape-character]
Вираз LIKE повертає значення true, якщо рядок відповідає заданому шаблону (як і очікувалося, вираз NOT LIKE повертає значення false, якщо LIKE повертає значення true, і навпаки).
Якщо шаблон не містить знаків відсотків або підкреслень, то шаблон представляє лише сам рядок; у цьому випадку LIKE діє як оператор рівності. Підкреслення (_) у шаблоні означає (відповідає) будь-якому окремому символу; знак відсотка (%) відповідає будь-якій послідовності з нуля або більше символів.
Деякі приклади:
'abc' LIKE 'abc' -- true
'abc' LIKE 'a%' -- true
'abc' LIKE '_b_' -- true
'abc' LIKE 'c' -- false
шаблони LIKE завжди збігаються з усім рядком. Тому, якщо потрібно знайти послідовність у будь-якому місці рядка, шаблон повинен починатися і закінчуватися знаком відсотка.
Для відповідності буквеному підкресленню або відсотковому знаку без відповідності іншим символам перед відповідним символом у шаблоні має стояти екранований символ. Типовим символом за замовчуванням є зворотна коса риска, але ви можете вибрати інший символ за допомогою пункту ESCAPE. Щоб відповідати самому символу екранування, напишіть два символи екранування.
Ключове слово ILIKE можна використовувати замість LIKE, щоб зробити збіг нечутливим до регістру відповідно до активної локалі. Це не передбачено стандартом SQL, але є розширенням PostgreSQL.
Функції та оператори дати/часу
Вилучення
- exctract(field FROM source)
Функція
extractвитягує підполя, такі як рік або година, зі значення дати/часу. Джерело має бути виразом типуtimestamp,timeабоinterval. Вирази типуdateприводяться доtimestamp, тому їх також можна використовувати.field- це ідентифікатор або рядок, який вказує, яке саме поле потрібно витягти з вихідного значення. Функція extract повертає значення типуnumeric. Нижче наведено припустимі імена полів:centurtydaydecadedowdoyepochhourisodowisoyearjulianmicrosecondsmillenniummillisecondsminutemonthquartersecondtimezonetimezone_hourtimezone_minuteweekyear
Функція date_part змодельована на основі традиційного для Ingres еквівалента стандартної функції SQL extract:
- date_part('field', source)
Поточна дата/час
PostgreSQL надає ряд функцій, які повертають значення, пов’язані з поточною датою і часом. Всі ці стандартні функції SQL повертають значення на основі часу початку поточної транзакції:
- CURRENT_DATE()
- CURRENT_TIME()
- CURRENT_TIME(precision)
Надавати поточне значення часу з часовим поясом.
- точність:
Необов’язковий параметр, який призводить до округлення результату до такої кількості дробових цифр у другому полі. Якщо параметр не вказано, результат буде надано з повною доступною точністю.
- CURRENT_TIMESTAMP()
- CURRENT_TIMESTAMP(precision)
Видавати поточне значення мітки часу з часовим поясом.
- точність:
Необов’язковий параметр, який призводить до округлення результату до такої кількості дробових цифр у другому полі. Якщо параметр не вказано, результат буде надано з повною доступною точністю.
- LOCALTIME()
- LOCALTIME(precision)
Надавати поточне значення часу без часового поясу.
- точність:
Необов’язковий параметр, який призводить до округлення результату до такої кількості дробових цифр у другому полі. Якщо параметр не вказано, результат буде надано з повною доступною точністю.
- LOCALTIMESTAMP()
- LOCALTIMESTAMP(precision)
Надавати поточне значення часу без часового поясу.
- точність:
Необов’язковий параметр, який призводить до округлення результату до такої кількості дробових цифр у другому полі. Якщо параметр не вказано, результат буде надано з повною доступною точністю.
Функції форматування
Функції форматування PostgreSQL надають потужний набір інструментів для перетворення різних типів даних (дата/час, цілі числа, числа з плаваючою комою, числові) у відформатовані рядки і для перетворення з відформатованих рядків у певні типи даних.
Всі ці функції мають загальну схему виклику: перший аргумент - це значення, яке потрібно відформатувати, а другий аргумент - шаблон, який визначає формат виводу або вводу.
- to_char ( timestamp, text ) → text
- to_char ( timestamp with time zone, text ) → text
Конвертує мітку часу в рядок відповідно до заданого формату.
to_char(timestamp '2002-04-20 17:31:12.66', 'HH12:MI:SS') → 05:31:12
- to_char ( interval, text ) → text
Перетворює інтервал у рядок відповідно до заданого формату.
to_char(interval '15h 2m 12s', 'HH24:MI:SS') → 15:02:12
- to_char ( numeric_type, text ) → text
Перетворює число в рядок відповідно до заданого формату; доступний для цілих, біґінтових, числових, дійсних, подвійної точності.
to_char(125, '999') → 125to_char(125.8::real, '999D9') → 125.8to_char(-125.8, '999D99S') → 125.80-
- to_date ( text, text ) → date
Конвертує рядок у дату відповідно до заданого формату.
to_date('05 Dec 2000', 'DD Mon YYYY') → 2000-12-05
- to_number ( text, text ) → numeric
Перетворює рядок у число відповідно до заданого формату.
to_number('12,454.8-', '99G999D9S') → -12454.8
- to_timestamp ( text, text ) → timestamp with time zone
Перетворює рядок у мітку часу відповідно до заданого формату.
to_timestamp('05 Dec 2000', 'DD Mon YYYY') → 2000-12-05 00:00:00-05
Умовні вирази
CASE
Вираз SQL CASE - це загальний умовний вираз, подібний до операторів if/else в інших мовах програмування.
COALESCE
Функція COALESCE повертає перший з аргументів, який не є нульовим. Null повертається лише у випадку, якщо всі аргументи є нульовими. Вона часто використовується для заміни значення за замовчуванням на нульові значення, коли дані отримуються для відображення:
SELECT COALESCE(description, short_description, '(none)') ...
Повертає description, якщо він не є нульовим, інакше short_description, якщо він не є нульовим, інакше (none).
Як і вираз CASE, COALESCE обчислює тільки ті аргументи, які потрібні для визначення результату; тобто аргументи праворуч від першого ненульового аргументу не обчислюються.
NULLIF
NULLIF(value_1, value_2)
Функція NULLIF повертає нульове значення_1, що дорівнює значенню_2; інакше повертає значення_1. Це може бути використано для виконання оберненої операції до COALESCE.
SELECT NULLIF(value, '(none)') ...
У наведеному вище прикладі, якщо value дорівнює (none), повертається нуль, інакше повертається значення value.
Два аргументи повинні бути порівнянних типів. Якщо бути точним, вони порівнюються так само, як якщо б ви написали value_1 = value_2, тому має бути відповідний оператор =.
Результат має той самий тип, що і перший аргумент - але є один нюанс. Насправді повертається перший аргумент неявного оператора =, і в деяких випадках він буде приведений до типу другого аргументу.
Агрегатні функції
Агрегатні функції обчислюють один результат з набору вхідних значень. Їх існує багато, і різні СКБД реалізують різні функції агрегації. У цьому розділі ми зосередимося лише на найбільш поширених і часто використовуваних агрегатних функціях.
Загальна схема використання представлена нижче:
Середнє значення
- avg(smallint) numeric
- avg(integer) numeric
- avg(bigint) numeric
- avg(numeric) numeric
- avg(real) double precision
- avg(double precision) double precision
- avg(interval) interval
Обчислює середнє значення (середнє арифметичне) всіх ненульових вхідних значень у групі
Важливо
SQLite реалізує функцію avg таким чином, що вона повертає NULL тоді і тільки тоді, коли всі вхідні дані є нулями. З іншого боку, PostgreSQL видасть помилку у цьому випадку.
SELECT extract(year from date) as year,
extract(month from date) as month,
ceil(avg(amount)) as avg
FROM revenue
GROUP BY month, year
ORDER BY year, month
LIMIT 5;
year |
month |
avg |
|---|---|---|
2013 |
11 |
7798 |
2013 |
12 |
6709 |
2014 |
1 |
6523 |
2014 |
2 |
6832 |
2014 |
3 |
10218 |
Кількість
- count(*) bigint
Обчислює кількість вхідних рядків
- count("any") bigint
Обчислює кількість вхідних рядків, в яких вхідне значення не дорівнює нулю
SELECT extract(year from date) as year,
extract(month from date) as month,
count(*)
FROM revenue
GROUP BY month, year
ORDER BY year, month
LIMIT 5;
year |
month |
count |
|---|---|---|
2013 |
11 |
5 |
2013 |
12 |
7 |
2014 |
1 |
5 |
2014 |
2 |
8 |
2014 |
3 |
5 |
Максимальне значення
- max(see text) same as input type
Обчислює максимальне з ненульових вхідних значень. Доступно для будь-яких чисел, рядків, дати/часу або перелічуваних типів.
SELECT extract(year from date) as year,
extract(month from date) as month,
max(amount)
FROM revenue
GROUP BY month, year
ORDER BY year, month
LIMIT 5;
year |
month |
max |
|---|---|---|
2013 |
11 |
12383 |
2013 |
12 |
12264 |
2014 |
1 |
8853 |
2014 |
2 |
12919 |
2014 |
3 |
14661 |
Мінімальне значення
- min(see text) same as input type
Обчислює мінімальне з ненульових вхідних значень. Доступно для будь-якого числового, рядкового, дати/часу або перелічуваного типу.
SELECT extract(year from date) as year,
extract(month from date) as month,
min(amount)
FROM revenue
GROUP BY month, year
ORDER BY year, month
LIMIT 5;
year |
month |
min |
|---|---|---|
2013 |
11 |
3365 |
2013 |
12 |
3564 |
2014 |
1 |
2636 |
2014 |
2 |
3442 |
2014 |
3 |
2654 |
Сума значень
- sum(smallint) bigint
- sum(integer) bigint
- sum(bigint) numeric
- sum(numeric) numeric
- sum(real) real
- sum(double precision) double precision
- sum(interval) interval
- sum(money) money
Обчислює суму ненульових значень
SELECT extract(year from date) as year,
extract(month from date) as month,
sum(amount)
FROM revenue
GROUP BY month, year
ORDER BY year, month
LIMIT 5;
year |
month |
сума |
|---|---|---|
2013 |
11 |
38988 |
2013 |
12 |
46958 |
2014 |
1 |
32611 |
2014 |
2 |
54652 |
2014 |
3 |
51087 |