9.2. ФÑнкÑии и опеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ #
ÐÐ°Ð±Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑов ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑÑÐ°ÐµÑ Ð¾Ð±ÑÑнÑе опеÑаÑоÑÑ, пеÑеÑиÑленнÑе в ТаблиÑе 9.1.
ТаблиÑа 9.1. ÐпеÑаÑоÑÑ ÑÑавнениÑ
| ÐпеÑаÑÐ¾Ñ | ÐпиÑание |
|---|---|
Ñип_даннÑÑ
< Ñип_даннÑÑ
â boolean | ÐенÑÑе |
Ñип_даннÑÑ
> Ñип_даннÑÑ
â boolean | ÐолÑÑе |
Ñип_даннÑÑ
<= Ñип_даннÑÑ
â boolean | ÐенÑÑе или Ñавно |
Ñип_даннÑÑ
>= Ñип_даннÑÑ
â boolean | ÐолÑÑе или Ñавно |
Ñип_даннÑÑ
= Ñип_даннÑÑ
â boolean | Равно |
Ñип_даннÑÑ
<> Ñип_даннÑÑ
â boolean | Ðе Ñавно |
Ñип_даннÑÑ
!= Ñип_даннÑÑ
â boolean | Ðе Ñавно |
ÐÑимеÑание
Ð ÑÑандаÑÑе SQL Ð´Ð»Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ Â«Ð½Ðµ Ñавно» пÑинÑÑа запиÑÑ <>. СинонимиÑÐ½Ð°Ñ ÐµÐ¹ запиÑÑ != пÑеобÑазÑеÑÑÑ Ð² <> на Ñамой Ñанней ÑÑадии ÑазбоÑа запÑоÑа. Ðак ÑледÑÑвие, ÑеализоваÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ != и <> Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ ÑабоÑали по-ÑазномÑ, невозможно.
ÐÑи опеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÑÑÑÑ Ð´Ð»Ñ Ð²ÑÐµÑ Ð²ÑÑÑоеннÑÑ Ñипов даннÑÑ , знаÑÐµÐ½Ð¸Ñ ÐºÐ¾ÑоÑÑÑ ÑоÑÑиÑÑÑÑÑÑ ÐµÑÑеÑÑвеннÑм обÑазом, вклÑÑÐ°Ñ ÑиÑловÑе, ÑÑÑоковÑе ÑипÑ, а Ñакже ÑÐ¸Ð¿Ñ Ð´Ð°ÑÑ/вÑемени. ÐÑоме Ñого, ÑÑавниваÑÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð¼Ð°ÑÑивÑ, ÑоÑÑавнÑе ÑÐ¸Ð¿Ñ Ð¸ диапазонÑ, еÑли ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов ÑвлÑÑÑÑÑ ÑÑавниваемÑми.
ÐбÑÑно можно ÑÑавниваÑÑ Ñакже знаÑÐµÐ½Ð¸Ñ ÑвÑзаннÑÑ
Ñипов даннÑÑ
; напÑимеÑ, возможно ÑÑавнение integer > bigint. ÐекоÑоÑÑе подобнÑе опеÑаÑии ÑеализÑÑÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно «межÑиповÑми» опеÑаÑоÑами ÑÑавнениÑ, но еÑли Ñакого опеÑаÑоÑа неÑ, анализаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа попÑÑаеÑÑÑ Ð¿ÑивеÑÑи ÑаÑÑнÑе ÑÐ¸Ð¿Ñ Ðº более обÑим и пÑимениÑÑ Ð¿Ð¾Ð´Ñ
одÑÑий Ð´Ð»Ñ Ð½Ð¸Ñ
опеÑаÑÐ¾Ñ ÑÑавнениÑ.
Ðак показано вÑÑе, вÑе опеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ ÑвлÑÑÑÑÑ Ð±Ð¸Ð½Ð°ÑнÑми и возвÑаÑаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñипа boolean. Таким обÑазом, вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð° 1 < 2 < 3 недопÑÑÑÐ¸Ð¼Ñ (Ñак как не ÑÑÑеÑÑвÑÐµÑ Ð¾Ð¿ÐµÑаÑоÑа <, коÑоÑÑй Ð±Ñ ÑÑавнивал бÑлево знаÑение Ñ 3). ÐÐ»Ñ Ð¿ÑовеÑки наÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² инÑеÑвале, воÑполÑзÑйÑеÑÑ Ð¿ÑедикаÑом BETWEEN, опиÑаннÑм ниже.
СÑÑеÑÑвÑÐµÑ Ñакже неÑколÑко пÑедикаÑов ÑÑавнениÑ; они пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð² ТаблиÑе 9.2. Ðни ÑабоÑаÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ опеÑаÑоÑам, но имеÑÑ Ð¾ÑобÑй ÑинÑакÑиÑ, ÑÑÑановленнÑй ÑÑандаÑÑом SQL.
ТаблиÑа 9.2. ÐÑедикаÑÑ ÑÑавнениÑ
ÐÑÐµÐ´Ð¸ÐºÐ°Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐÐµÐ¶Ð´Ñ (вклÑÑÐ°Ñ Ð³ÑаниÑÑ Ð¸Ð½ÑеÑвала).
|
Ðе Ð¼ÐµÐ¶Ð´Ñ (обÑаÑное к
|
ÐеждÑ, поÑле ÑоÑÑиÑовки гÑаниÑнÑÑ Ð·Ð½Ð°Ñений.
|
Ðе междÑ, поÑле ÑоÑÑиÑовки гÑаниÑнÑÑ Ð·Ð½Ð°Ñений.
|
Ðе Ñавно, пÑи ÑÑом NULL воÑпÑинимаеÑÑÑ ÐºÐ°Ðº обÑÑное знаÑение.
|
Равно, пÑи ÑÑом NULL воÑпÑинимаеÑÑÑ ÐºÐ°Ðº обÑÑное знаÑение.
|
ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ знаÑение ÑквиваленÑнÑм NULL.
|
ÐÑовеÑÑеÑ, оÑлиÑаеÑÑÑ Ð»Ð¸ знаÑение Ð¾Ñ NULL.
|
ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ знаÑение ÑквиваленÑнÑм NULL (неÑÑандаÑÑнÑй ÑинÑакÑиÑ). |
ÐÑовеÑÑеÑ, оÑлиÑаеÑÑÑ Ð»Ð¸ знаÑение Ð¾Ñ NULL (неÑÑандаÑÑнÑй ÑинÑакÑиÑ). |
ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ ÑезÑлÑÑÐ°Ñ Ð»Ð¾Ð³Ð¸ÑеÑкого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñением true.
|
ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ ÑезÑлÑÑÐ°Ñ Ð»Ð¾Ð³Ð¸ÑеÑкого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñением false или неизвеÑÑнÑм.
|
ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ ÑезÑлÑÑÐ°Ñ Ð»Ð¾Ð³Ð¸ÑеÑкого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñением false.
|
ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ ÑезÑлÑÑÐ°Ñ Ð»Ð¾Ð³Ð¸ÑеÑкого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñением true или неизвеÑÑнÑм.
|
ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ ÑезÑлÑÑÐ°Ñ Ð»Ð¾Ð³Ð¸ÑеÑкого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑнÑм знаÑением.
|
ÐÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ ÑезÑлÑÑÐ°Ñ Ð»Ð¾Ð³Ð¸ÑеÑкого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñением true или false.
|
ÐÑÐµÐ´Ð¸ÐºÐ°Ñ BETWEEN ÑпÑоÑÐ°ÐµÑ Ð¿ÑовеÑки инÑеÑвала:
aBETWEENxANDy
ÑавнознаÑно
a>=xANDa<=y
ÐамеÑÑÑе, ÑÑо BETWEEN ÑÑиÑаеÑ, ÑÑо гÑаниÑÑ Ð¸Ð½ÑеÑвала вклÑÑаÑÑÑÑ Ð² инÑеÑвал. ÐÑÐµÐ´Ð¸ÐºÐ°Ñ BETWEEN SYMMETRIC аналогиÑен BETWEEN, за иÑклÑÑением Ñого, ÑÑо аÑгÑÐ¼ÐµÐ½Ñ Ñлева Ð¾Ñ AND не обÑзаÑелÑно должен бÑÑÑ Ð¼ÐµÐ½ÑÑе или Ñавен аÑгÑменÑÑ ÑпÑава. ÐÑли ÑÑо не Ñак, аÑгÑменÑÑ Ð°Ð²ÑомаÑиÑеÑки менÑÑÑÑÑ Ð¼ÐµÑÑами, Ñак ÑÑо вÑегда подÑазÑмеваеÑÑÑ Ð½ÐµÐ¿ÑÑÑой инÑеÑвал.
РазлиÑнÑе ваÑианÑÑ BETWEEN ÑеализÑÑÑÑÑ Ð¿Ð¾ÑÑедÑÑвом обÑÑнÑÑ
опеÑаÑоÑов ÑÑавнениÑ, и поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ бÑдÑÑ ÑабоÑаÑÑ Ñ Ð»ÑбÑми Ñипами даннÑÑ
, коÑоÑÑе можно ÑÑавниваÑÑ.
ÐÑимеÑание
ÐÑполÑзование AND в конÑÑÑÑкÑии BETWEEN ÑоздаÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑноÑÑÑ Ñ Ð¸ÑполÑзованием AND в каÑеÑÑве логиÑеÑкого опеÑаÑоÑа. ÐÐ»Ñ ÐµÑ ÑÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð² каÑеÑÑве вÑоÑого аÑгÑменÑа пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ BETWEEN пÑинимаеÑÑÑ ÑолÑко огÑаниÑеннÑй Ð½Ð°Ð±Ð¾Ñ Ñипов вÑÑажений. ÐÑли вам нÑжно запиÑаÑÑ Ð±Ð¾Ð»ÐµÐµ Ñложное подвÑÑажение в BETWEEN, заклÑÑиÑе ÑÑо подвÑÑажение в Ñкобки.
ÐбÑÑнÑе опеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð²ÑдаÑÑ NULL (ÑÑо ознаÑÐ°ÐµÑ Â«Ð½ÐµÐ¾Ð¿ÑеделÑнноÑÑÑ»), а не true или false, когда лÑбое из ÑÑавниваемÑÑ
знаÑений NULL. ÐапÑимеÑ, 7 = NULL вÑдаÑÑ NULL, Ñак же, как и 7 <> NULL. Ðогда ÑÑо поведение нежелаÑелÑно, можно иÑполÑзоваÑÑ Ð¿ÑедикаÑÑ IS [ NOT ] DISTINCT FROM:
aIS DISTINCT FROMbaIS NOT DISTINCT FROMb
ÐÐ»Ñ Ð·Ð½Ð°Ñений не NULL ÑÑловие IS DISTINCT FROM ÑабоÑÐ°ÐµÑ Ñак же, как опеÑаÑÐ¾Ñ <>. Ðднако еÑли оба ÑÑавниваемÑÑ
знаÑÐµÐ½Ð¸Ñ NULL, ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ false, и ÑолÑко еÑли одно из знаÑений NULL, возвÑаÑаеÑÑÑ true. ÐналогиÑно, ÑÑловие IS NOT DISTINCT FROM ÑавноÑилÑно = Ð´Ð»Ñ Ð·Ð½Ð°Ñений не NULL, но возвÑаÑÐ°ÐµÑ true, еÑли оба ÑÑавниваемÑÑ
знаÑÐµÐ½Ð¸Ñ NULL, и false в пÑоÑивном ÑлÑÑае. Таким обÑазом, ÑÑи пÑедикаÑÑ Ð¿Ð¾ ÑÑÑи ÑабоÑаÑÑ Ñ NULL, как Ñ Ð¾Ð±ÑÑнÑм знаÑением, а не Ñ Â«Ð½ÐµÐ¾Ð¿ÑеделÑнноÑÑÑÑ».
ÐÐ»Ñ Ð¿ÑовеÑки, ÑодеÑÐ¶Ð¸Ñ Ð»Ð¸ знаÑение NULL или неÑ, иÑполÑзÑÑÑÑÑ Ð¿ÑедикаÑÑ:
вÑÑажениеIS NULLвÑÑажениеIS NOT NULL
или ÑавнознаÑнÑе (но неÑÑандаÑÑнÑе) пÑедикаÑÑ:
вÑÑажениеISNULLвÑÑажениеNOTNULL
ÐамеÑÑÑе, ÑÑо пÑовеÑка не бÑÐ´ÐµÑ ÑабоÑаÑÑ, Ñак как вÑÑажение = NULLNULL ÑÑиÑаеÑÑÑ Ð½Ðµ «ÑавнÑм» NULL. (ÐнаÑение NULL пÑедÑÑавлÑÐµÑ Ð½ÐµÐ¾Ð¿ÑеделÑнноÑÑÑ, и ÑÐ°Ð²Ð½Ñ Ð»Ð¸ две неопÑеделÑнноÑÑи, Ñоже не опÑеделено.)
ÐодÑказка
ÐекоÑоÑÑе пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ, ÑÑо веÑнÑÑ true, еÑли ÑезÑлÑÑаÑом вÑÑажение = NULLвÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑвлÑеÑÑÑ NULL. Такие пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð°ÑÑоÑÑелÑно ÑекомендÑеÑÑÑ Ð¸ÑпÑавиÑÑ Ð¸ пÑивеÑÑи в ÑооÑвеÑÑÑвие Ñо ÑÑандаÑÑом SQL. Ðднако в ÑлÑÑаÑÑ
, когда ÑÑо невозможно, ÑÑо поведение можно измениÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿Ð°ÑамеÑÑа конÑигÑÑаÑии transform_null_equals. Ðогда ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð²ÐºÐ»ÑÑÑн, Postgres Pro пÑеобÑазÑÐµÑ ÑÑловие x = NULL в x IS NULL.
ÐÑли вÑÑажение возвÑаÑÐ°ÐµÑ ÑаблиÑнÑÑ ÑÑÑокÑ, Ñогда IS NULL бÑÐ´ÐµÑ Ð¸ÑÑиннÑм, когда Ñамо вÑÑажение â NULL или вÑе Ð¿Ð¾Ð»Ñ ÑÑÑоки â NULL, а IS NOT NULL бÑÐ´ÐµÑ Ð¸ÑÑиннÑм, когда Ñамо вÑÑажение не NULL, и вÑе Ð¿Ð¾Ð»Ñ ÑÑÑоки Ñак же не NULL. ÐÑледÑÑвие Ñакого опÑеделениÑ, IS NULL и IS NOT NULL не вÑегда бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑие ÑезÑлÑÑаÑÑ Ð´Ð»Ñ ÑакиÑ
вÑÑажений; в ÑаÑÑноÑÑи Ñакие вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñо ÑÑÑоками, одни Ð¿Ð¾Ð»Ñ ÐºÐ¾ÑоÑÑÑ
NULL, а дÑÑгие не NULL, бÑдÑÑ Ð»Ð¾Ð¶Ð½Ñми одновÑеменно. РнекоÑоÑÑÑ
ÑлÑÑаÑÑ
Ð¸Ð¼ÐµÐµÑ ÑмÑÑл напиÑаÑÑ ÑÑÑока IS DISTINCT FROM NULL или ÑÑÑока IS NOT DISTINCT FROM NULL, ÑÑÐ¾Ð±Ñ Ð¿ÑоÑÑо пÑовеÑиÑÑ, Ñавно ли NULL вÑÑ Ð·Ð½Ð°Ñение ÑÑÑоки, без какиÑ
-либо дополниÑелÑнÑÑ
пÑовеÑок полей ÑÑÑоки.
ÐогиÑеÑкие знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ Ñакже пÑовеÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿ÑедикаÑов
логиÑеÑкое_вÑÑажениеIS TRUEлогиÑеÑкое_вÑÑажениеIS NOT TRUEлогиÑеÑкое_вÑÑажениеIS FALSEлогиÑеÑкое_вÑÑажениеIS NOT FALSEлогиÑеÑкое_вÑÑажениеIS UNKNOWNлогиÑеÑкое_вÑÑажениеIS NOT UNKNOWN
Ðни вÑегда возвÑаÑаÑÑ true или false и никогда NULL, даже еÑли какой-лÑбо опеÑанд â NULL. Ðни инÑеÑпÑеÑиÑÑÑÑ Ð·Ð½Ð°Ñение NULL как «неопÑеделÑнноÑÑÑ». ÐамеÑÑÑе, ÑÑо IS UNKNOWN и IS NOT UNKNOWN по ÑÑÑи ÑавнознаÑÐ½Ñ IS NULL и IS NOT NULL, ÑооÑвеÑÑÑвенно, за иÑклÑÑением Ñого, ÑÑо вÑÑажение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко бÑлевого Ñипа.
Также имееÑÑÑ Ð½ÐµÑколÑко ÑвÑзаннÑÑ Ñо ÑÑавнениÑми ÑÑнкÑий; они пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 9.3.
ТаблиÑа 9.3. ФÑнкÑии ÑÑавнениÑ