Функції та оператори
Логічні оператори та оператори порівняння
Звичні логічні оператори все ще доступні:
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
. Нижче наведено припустимі імена полів:centurty
day
decade
dow
doy
epoch
hour
isodow
isoyear
julian
microseconds
millennium
milliseconds
minute
month
quarter
second
timezone
timezone_hour
timezone_minute
week
year
Функція 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') → 125
to_char(125.8::real, '999D9') → 125.8
to_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 |