10.2. ÐпеÑаÑоÑÑ #
ÐÑи вÑбоÑе конкÑеÑного опеÑаÑоÑа, задейÑÑвованного в вÑÑажении, PostgreSQL ÑледÑÐµÑ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð½Ð¾Ð¼Ñ Ð½Ð¸Ð¶Ðµ алгоÑиÑмÑ. ÐамеÑÑÑе, ÑÑо на ÑÑÐ¾Ñ Ð²ÑÐ±Ð¾Ñ Ð¼Ð¾Ð³ÑÑ Ð½ÐµÑвно влиÑÑÑ Ð¿ÑиоÑиÑеÑÑ Ð¾ÑÑалÑнÑÑ Ð¾Ð¿ÐµÑаÑоÑов в данном вÑÑажении, Ñак как они опÑеделÑÑÑ, какие подвÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð°ÑгÑменÑами опеÑаÑоÑов. ÐодÑобнее об ÑÑом ÑаÑÑказÑваеÑÑÑ Ð² ÐодÑазделе 4.1.6.
ÐÑÐ±Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑа по ÑипÑ
ÐÑбÑаÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð´Ð»Ñ ÑаÑÑмоÑÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑиÑÑемного каÑалога
pg_operator. ÐÑли Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑа не дополнено именем ÑÑ ÐµÐ¼Ñ (обÑÑно ÑÑо Ñак), бÑдÑÑ ÑаÑÑмаÑÑиваÑÑÑÑ Ð²Ñе опеÑаÑоÑÑ Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑим именем и ÑиÑлом аÑгÑменÑов, видимÑе в ÑекÑÑем пÑÑи поиÑка (Ñм. ÐодÑаздел 5.10.3). ÐÑли Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑа опÑеделено полноÑÑÑÑ, в ÑаÑÑмоÑÑение пÑинимаÑÑÑÑ ÑолÑко опеÑаÑоÑÑ Ð¸Ð· Ñказанной ÑÑ ÐµÐ¼Ñ.ÐÑли в пÑÑи поиÑка оказÑваеÑÑÑ Ð½ÐµÑколÑко опеÑаÑоÑов Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми Ñипами аÑгÑменÑов, ÑÑиÑÑваÑÑÑÑ ÑолÑко Ñе из Ð½Ð¸Ñ , коÑоÑÑе Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð² пÑÑи ÑанÑÑе. ÐпеÑаÑоÑÑ Ñ ÑазнÑми Ñипами аÑгÑменÑов ÑаÑÑмаÑÑиваÑÑÑÑ Ð½Ð° ÑавнÑÑ Ð¿ÑÐ°Ð²Ð°Ñ Ð²Ð½Ðµ завиÑимоÑÑи Ð¾Ñ Ð¸Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² пÑÑи поиÑка.
ÐÑовеÑиÑÑ, Ð½ÐµÑ Ð»Ð¸ ÑÑеди Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑа Ñ ÑоÑно ÑовпадаÑÑими Ñипами аÑгÑменÑов. ÐÑли Ñакой опеÑаÑÐ¾Ñ ÐµÑÑÑ (он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко одним в оÑобÑанном Ñанее набоÑе), иÑполÑзоваÑÑ ÐµÐ³Ð¾. ÐÑÑÑÑÑÑвие ÑоÑного ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ ÑоздаÑÑ ÑгÑÐ¾Ð·Ñ Ð²Ñзова Ñ Ñказанием полного имени [9] (неÑипиÑнÑм) лÑбого опеÑаÑоÑа, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð² ÑÑ ÐµÐ¼Ðµ, где могÑÑ ÑоздаваÑÑ Ð¾Ð±ÑекÑÑ Ð½ÐµÐ´Ð¾Ð²ÐµÑеннÑе полÑзоваÑели. Ð ÑÐ°ÐºÐ¸Ñ ÑиÑÑаÑиÑÑ Ð¿ÑиведиÑе ÑÐ¸Ð¿Ñ Ð°ÑгÑменÑов Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑоÑного ÑовпадениÑ.
ÐÑли один аÑгÑÐ¼ÐµÐ½Ñ Ð¿Ñи вÑзове бинаÑного опеÑаÑоÑа Ð¸Ð¼ÐµÐµÑ Ñип
unknown, Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ пÑовеÑки пÑедполагаеÑÑÑ, ÑÑо он Ð¸Ð¼ÐµÐµÑ ÑÐ¾Ñ Ð¶Ðµ Ñип, ÑÑо и вÑоÑой его аÑгÑменÑ. ÐÑи вÑзове бинаÑного опеÑаÑоÑа Ñ Ð´Ð²ÑÐ¼Ñ Ð°ÑгÑменÑамиunknownили пÑеÑикÑного Ñ Ð¾Ð´Ð½Ð¸Ð¼unknownопеÑаÑÐ¾Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð²ÑбÑан на ÑÑом Ñаге.ÐÑли один аÑгÑÐ¼ÐµÐ½Ñ Ð¿Ñи вÑзове бинаÑного опеÑаÑоÑа Ð¸Ð¼ÐµÐµÑ Ñип
unknown, а дÑÑгой â домен, пÑовеÑиÑÑ, еÑÑÑ Ð»Ð¸ опеÑаÑоÑ, пÑинимаÑÑий базовÑй Ñип домена Ñ Ð¾Ð±ÐµÐ¸Ñ ÑÑоÑон; еÑли Ñаковой Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ, иÑполÑзоваÑÑ ÐµÐ³Ð¾.
ÐайÑи ÑамÑй Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑий.
ÐÑбÑоÑиÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð²Ñ Ð¾Ð´Ð½Ñе ÑÐ¸Ð¿Ñ Ð½Ðµ ÑовпадаÑÑ Ð¸ не могÑÑ Ð±ÑÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ñ (неÑвнÑм обÑазом) Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ Ñовпали. Рданном ÑлÑÑае ÑÑиÑаеÑÑÑ, ÑÑо конÑÑанÑÑ Ñипа
unknownможно пÑеобÑазоваÑÑ Ð²Ð¾ ÑÑо Ñгодно. ÐÑли оÑÑаÑÑÑÑ ÑолÑко один кандидаÑ, иÑполÑзоваÑÑ ÐµÐ³Ð¾, в пÑоÑивном ÑлÑÑае пеÑейÑи к ÑледÑÑÑÐµÐ¼Ñ ÑагÑ.ÐÑли один из аÑгÑменÑов Ð¸Ð¼ÐµÐµÑ Ñип домен, далее ÑÑиÑаÑÑ ÐµÐ³Ð¾ Ñипом базовÑй Ñип домена. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¿Ñи поиÑке неоднознаÑно заданного опеÑаÑоÑа Ð´Ð¾Ð¼ÐµÐ½Ñ Ð±ÑдÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñ Ñвои базовÑм Ñипам.
ÐÑоÑмоÑÑеÑÑ Ð²ÑÐµÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов и оÑÑавиÑÑ ÑолÑко ÑÐµÑ , Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ ÑоÑно ÑовпадаÑÑ ÐºÐ°Ðº можно болÑÑе Ñипов аÑгÑменÑов. ÐÑÑавиÑÑ Ð²ÑÐµÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов, еÑли ÑоÑнÑÑ Ñовпадений неÑ. ÐÑли оÑÑаÑÑÑÑ ÑолÑко один кандидаÑ, иÑполÑзоваÑÑ ÐµÐ³Ð¾, в пÑоÑивном ÑлÑÑае пеÑейÑи к ÑледÑÑÑÐµÐ¼Ñ ÑагÑ.
ÐÑоÑмоÑÑеÑÑ Ð²ÑÐµÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов и оÑÑавиÑÑ ÑолÑко ÑÐµÑ , коÑоÑÑе пÑинимаÑÑ Ð¿ÑедпоÑиÑаемÑе ÑÐ¸Ð¿Ñ (из каÑегоÑии Ñипов Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð·Ð½Ð°Ñений) в наиболÑÑем ÑиÑле позиÑий, где ÑÑебÑеÑÑÑ Ð¿ÑеобÑазование Ñипов. ÐÑÑавиÑÑ Ð²ÑÐµÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов, еÑли ни один не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¿ÑедпоÑиÑаемÑе ÑипÑ. ÐÑли оÑÑаÑÑÑÑ ÑолÑко один кандидаÑ, иÑполÑзоваÑÑ ÐµÐ³Ð¾, в пÑоÑивном ÑлÑÑае пеÑейÑи к ÑледÑÑÑÐµÐ¼Ñ ÑагÑ.
ÐÑли какие-либо знаÑÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÑÑ Ñип
unknown, пÑовеÑиÑÑ ÐºÐ°ÑегоÑии Ñипов, пÑинимаемÑÑ Ð² даннÑÑ Ð¿Ð¾Ð·Ð¸ÑиÑÑ Ð°ÑгÑменÑов оÑÑавÑимиÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñами. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ позиÑии вÑбÑаÑÑ ÐºÐ°ÑегоÑиÑstring, еÑли какой-либо ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑÑÑ ÐºÐ°ÑегоÑиÑ. (ÐÑа ÑклонноÑÑÑ Ðº ÑÑÑокам обÑÑÑнÑеÑÑÑ Ñем, ÑÑо конÑÑанÑа Ñипа unknown вÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº ÑÑÑока.) ÐÑли ÑÑа каÑегоÑÐ¸Ñ Ð½Ðµ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ, но вÑе оÑÑавÑиеÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°ÑÑ Ð¿ÑинимаÑÑ Ð¾Ð´Ð½Ñ ÐºÐ°ÑегоÑиÑ, вÑбÑаÑÑ ÐµÑ; в пÑоÑивном ÑлÑÑае конÑÑаÑиÑоваÑÑ Ð½ÐµÑдаÑÑ â ÑделаÑÑ Ð¿ÑавилÑнÑй вÑÐ±Ð¾Ñ Ð±ÐµÐ· дополниÑелÑнÑÑ Ð¿Ð¾Ð´Ñказок нелÑзÑ. ÐаÑем оÑбÑоÑиÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов, коÑоÑÑе не пÑинимаÑÑ ÑÐ¸Ð¿Ñ Ð²ÑбÑанной каÑегоÑии. Ðалее, еÑли какой-либо ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¿ÑедпоÑиÑаемÑй Ñип из ÑÑой каÑегоÑии, оÑбÑоÑиÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов, пÑинимаÑÑÐ¸Ñ Ð´ÑÑгие, не пÑедпоÑиÑаемÑе ÑÐ¸Ð¿Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ аÑгÑменÑа. ÐÑÑавиÑÑ Ð²ÑÐµÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов, еÑли ÑÑи пÑовеÑки не пÑоÑÑл ни один. ÐÑли оÑÑаÑÑÑÑ ÑолÑко один кандидаÑ, иÑполÑзоваÑÑ ÐµÐ³Ð¾, в пÑоÑивном ÑлÑÑае пеÑейÑи к ÑледÑÑÑÐµÐ¼Ñ ÑагÑ.ÐÑли в ÑпиÑке аÑгÑменÑов еÑÑÑ Ð°ÑгÑменÑÑ Ð¸ Ñипа
unknown, и извеÑÑного Ñипа, и ÑÑÐ¾Ñ Ð¸Ð·Ð²ÐµÑÑнÑй Ñип один Ð´Ð»Ñ Ð²ÑÐµÑ Ð°ÑгÑменÑов, пÑедположиÑÑ, ÑÑо аÑгÑменÑÑ ÑипаunknownÑакже имеÑÑ ÑÑÐ¾Ñ Ñип, и пÑовеÑиÑÑ, какие кандидаÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿ÑинимаÑÑ ÑÑÐ¾Ñ Ñип в позиÑии аÑгÑменÑаunknown. ÐÑли оÑÑаÑÑÑÑ ÑолÑко один кандидаÑ, иÑполÑзоваÑÑ ÐµÐ³Ð¾, в пÑоÑивном ÑлÑÑае конÑÑаÑиÑоваÑÑ Ð½ÐµÑдаÑÑ.
Ðиже ÑÑо пÑоиллÑÑÑÑиÑовано на пÑимеÑÐ°Ñ .
ÐÑÐ¸Ð¼ÐµÑ 10.1. РазÑеÑение Ñипа Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа квадÑаÑного коÑнÑ
Ð ÑÑандаÑÑном каÑалоге опÑеделÑн ÑолÑко один опеÑаÑÐ¾Ñ ÐºÐ²Ð°Ð´ÑаÑного коÑÐ½Ñ (пÑеÑикÑнÑй |/) и он пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ñипа double precision. ÐÑи пÑоÑмоÑÑе ÑледÑÑÑего вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ аÑгÑменÑÑ Ð¸Ð·Ð½Ð°ÑалÑно назнаÑаеÑÑÑ Ñип integer:
SELECT |/ 40 AS "square root of 40"; square root of 40 ------------------- 6.324555320336759 (1 row)
ÐоÑÑÐ¾Ð¼Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑÐ¾Ñ Ð¿ÑеобÑазÑÐµÑ Ñип ÑÑого опеÑанда и запÑÐ¾Ñ ÑÑановиÑÑÑ ÑавноÑилÑнÑм ÑакомÑ:
SELECT |/ CAST(40 AS double precision) AS "square root of 40";
ÐÑÐ¸Ð¼ÐµÑ 10.2. РазÑеÑение опеÑаÑоÑа конкаÑенаÑии ÑÑÑок
СинÑакÑÐ¸Ñ ÑекÑÑовÑÑ ÑÑÑок иÑполÑзÑеÑÑÑ ÐºÐ°Ðº Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑÑÑоковÑÑ Ñипов, Ñак и Ð´Ð»Ñ ÑложнÑÑ Ñипов ÑаÑÑиÑений. ÐÑли Ñип не Ñказан Ñвно, Ñакие ÑÑÑоки ÑопоÑÑавлÑÑÑÑÑ Ð¿Ð¾ ÑÐ¾Ð¼Ñ Ð¶Ðµ алгоÑиÑÐ¼Ñ Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑими опеÑаÑоÑами.
ÐÑÐ¸Ð¼ÐµÑ Ñ Ð¾Ð´Ð½Ð¸Ð¼ неопÑеделÑннÑм аÑгÑменÑом:
SELECT text 'abc' || 'def' AS "text and unknown"; text and unknown ------------------ abcdef (1 row)
Ð ÑÑом ÑлÑÑае анализаÑÐ¾Ñ ÑмоÑÑиÑ, еÑÑÑ Ð»Ð¸ опеÑаÑоÑ, Ñ ÐºÐ¾ÑоÑого оба аÑгÑменÑа имеÑÑ Ñип text. Такой опеÑаÑÐ¾Ñ Ð½Ð°Ñ
одиÑÑÑ, поÑÑÐ¾Ð¼Ñ Ð¿ÑедполагаеÑÑÑ, ÑÑо вÑоÑой аÑгÑÐ¼ÐµÐ½Ñ ÑледÑÐµÑ Ð²Ð¾ÑпÑинимаÑÑ ÐºÐ°Ðº аÑгÑÐ¼ÐµÐ½Ñ Ñипа text.
ÐонкаÑенаÑÐ¸Ñ Ð´Ð²ÑÑ Ð·Ð½Ð°Ñений неопÑеделÑннÑÑ Ñипов:
SELECT 'abc' || 'def' AS "unspecified"; unspecified ------------- abcdef (1 row)
Рданном ÑлÑÑае Ð½ÐµÑ Ð¿Ð¾Ð´Ñказки Ð´Ð»Ñ Ð²ÑбоÑа Ñипа, Ñак как в данном запÑоÑе никакие ÑÐ¸Ð¿Ñ Ð½Ðµ ÑказанÑ. ÐоÑÑÐ¾Ð¼Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑÐ¾Ñ Ð¿ÑоÑмаÑÑÐ¸Ð²Ð°ÐµÑ Ð²Ñе возможнÑе опеÑаÑоÑÑ Ð¸ наÑ
Ð¾Ð´Ð¸Ñ Ð² ниÑ
кандидаÑов, пÑинимаÑÑиÑ
аÑгÑменÑÑ ÐºÐ°ÑегоÑий string и bit-string. Так как каÑегоÑÐ¸Ñ string ÑвлÑеÑÑÑ Ð¿ÑедпоÑÑиÑелÑной, вÑбиÑаеÑÑÑ Ð¾Ð½Ð°, а заÑем Ð´Ð»Ñ ÑазÑеÑÐµÐ½Ð¸Ñ Ñипа не ÑипизиÑованной конÑÑанÑÑ Ð²ÑбиÑаеÑÑÑ Ð¿ÑедпоÑÑиÑелÑнÑй Ñип ÑÑой каÑегоÑии, text.
ÐÑÐ¸Ð¼ÐµÑ 10.3. РазÑеÑение опеÑаÑоÑа абÑолÑÑного знаÑÐµÐ½Ð¸Ñ Ð¸ оÑÑиÑаниÑ
РкаÑалоге опеÑаÑоÑов PostgreSQL Ð´Ð»Ñ Ð¿ÑеÑикÑного опеÑаÑоÑа @ еÑÑÑ Ð½ÐµÑколÑко запиÑей, опиÑÑваÑÑиÑ
опеÑаÑии полÑÑÐµÐ½Ð¸Ñ Ð°Ð±ÑолÑÑного знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑазлиÑнÑÑ
ÑиÑловÑÑ
Ñипов даннÑÑ
. Ðдна из запиÑей ÑооÑвеÑÑÑвÑÐµÑ ÑÐ¸Ð¿Ñ float8, пÑедпоÑÑиÑелÑного в каÑегоÑии ÑиÑловÑÑ
Ñипов. Таким обÑазом, ÑÑолкнÑвÑиÑÑ Ñо знаÑением Ñипа unknown, PostgreSQL вÑбеÑÐµÑ ÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ:
SELECT @ '-4.5' AS "abs"; abs ----- 4.5 (1 row)
ÐдеÑÑ ÑиÑÑема неÑвно пÑивела конÑÑанÑÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑного Ñипа к ÑÐ¸Ð¿Ñ float8, пÑежде Ñем пÑименÑÑÑ Ð²ÑбÑаннÑй опеÑаÑоÑ. Ðожно ÑбедиÑÑÑÑ Ð² Ñом, ÑÑо вÑбÑан именно Ñип float8, а не какой-Ñо дÑÑгой:
SELECT @ '-4.5e500' AS "abs"; ÐШÐÐÐÐ: "-4.5e500" вне диапазона Ð´Ð»Ñ Ñипа double precision
С дÑÑгой ÑÑоÑонÑ, пÑеÑикÑнÑй опеÑаÑÐ¾Ñ ~ (побиÑовое оÑÑиÑание) опÑеделÑн ÑолÑко Ð´Ð»Ñ ÑелоÑиÑленнÑÑ
Ñипов даннÑÑ
, но не Ð´Ð»Ñ float8. ÐоÑÑомÑ, еÑли попÑÑаÑÑÑÑ Ð²ÑполниÑÑ Ð¿Ð¾Ñ
ожий запÑÐ¾Ñ Ñ ~, Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем:
SELECT ~ '20' AS "negation"; ÐШÐÐÐÐ: опеÑаÑÐ¾Ñ Ð½Ðµ Ñникален: ~ "unknown" ÐÐÐСÐÐÐÐÐ: Ðе ÑдалоÑÑ Ð²ÑбÑаÑÑ Ð»ÑÑÑÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°ÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа. Ðозможно, вам ÑледÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ ÑвнÑе пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñипов.
ÐÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¾ÑÑого, ÑÑо ÑиÑÑема не Ð¼Ð¾Ð¶ÐµÑ ÑеÑиÑÑ, какой опеÑаÑÐ¾Ñ Ð¿ÑедпоÑеÑÑÑ Ð¸Ð· неÑколÑкиÑ
возможнÑÑ
ваÑианÑов ~. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ облегÑиÑÑ ÐµÑ Ð·Ð°Ð´Ð°ÑÑ, добавив Ñвное пÑеобÑазование:
SELECT ~ CAST('20' AS int8) AS "negation";
negation
----------
-21
(1 row)
ÐÑÐ¸Ð¼ÐµÑ 10.4. РазÑеÑение опеÑаÑоÑа вклÑÑÐµÐ½Ð¸Ñ Ð² маÑÑив
ÐÑÑ Ð¾Ð´Ð¸Ð½ пÑÐ¸Ð¼ÐµÑ ÑазÑеÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑа Ñ Ð¾Ð´Ð½Ð¸Ð¼ аÑгÑменÑом извеÑÑного Ñипа и дÑÑгим неизвеÑÑного:
SELECT array[1,2] <@ '{1,2,3}' as "is subset";
is subset
-----------
t
(1 row)
РкаÑалоге опеÑаÑоÑов PostgreSQL еÑÑÑ Ð½ÐµÑколÑко запиÑей Ð´Ð»Ñ Ð¸Ð½ÑикÑного опеÑаÑоÑа <@, но ÑолÑко два из ниÑ
могÑÑ Ð¿ÑинÑÑÑ ÑелоÑиÑленнÑй маÑÑива Ñлева: опеÑаÑÐ¾Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑива (anyarray<@anyarray) и опеÑаÑÐ¾Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° (anyelement<@anyrange). Так как ни один из ÑÑиÑ
полимоÑÑнÑÑ
пÑевдоÑипов (Ñм. Раздел 8.21) не ÑÑиÑаеÑÑÑ Ð¿ÑедпоÑÑиÑелÑнÑм, анализаÑÐ¾Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð±Ð°Ð²Ð¸ÑÑÑÑ Ð¾Ñ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑноÑÑи на данном ÑÑапе. Ðднако в Шаг 3.f говоÑиÑÑÑ, ÑÑо конÑÑанÑа неизвеÑÑного Ñипа должна ÑаÑÑмаÑÑиваÑÑÑÑ ÐºÐ°Ðº знаÑение Ñипа дÑÑгого аÑгÑменÑа, в данном ÑлÑÑае ÑÑо ÑелоÑиÑленнÑй маÑÑив. ÐоÑле ÑÑого подÑ
одÑÑим ÑÑиÑаеÑÑÑ ÑолÑко один из двÑÑ
опеÑаÑоÑов, Ñак ÑÑо вÑбиÑаеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ñ ÑелоÑиÑленнÑми маÑÑивами. (ÐÑли Ð±Ñ Ð±Ñл вÑбÑан опеÑаÑÐ¾Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°, Ð¼Ñ Ð¿Ð¾Ð»ÑÑили Ð±Ñ Ð¾ÑибкÑ, Ñак как знаÑение в ÑÑÑоке не ÑооÑвеÑÑÑвÑÐµÑ ÑоÑмаÑÑ Ð·Ð½Ð°Ñений диапазона.)
ÐÑÐ¸Ð¼ÐµÑ 10.5. ÐеÑÑандаÑÑнÑй опеÑаÑÐ¾Ñ Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð¼
Ðногда полÑзоваÑели пÑÑаÑÑÑÑ Ð²Ð²ÐµÑÑи опеÑаÑоÑÑ, пÑименимÑе ÑолÑко к опÑеделÑÐ½Ð½Ð¾Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ. ÐÑо возможно, но вовÑе не Ñак полезно, как Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ, Ð²ÐµÐ´Ñ Ð¿Ñавила ÑазÑеÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов пÑименÑÑÑÑÑ Ðº Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°. ÐзглÑниÑе на ÑÑÐ¾Ñ Ð¿ÑимеÑ:
CREATE DOMAIN mytext AS text CHECK(...); CREATE FUNCTION mytext_eq_text (mytext, text) RETURNS boolean AS ...; CREATE OPERATOR = (procedure=mytext_eq_text, leftarg=mytext, rightarg=text); CREATE TABLE mytable (val mytext); SELECT * FROM mytable WHERE val = 'foo';
Ð ÑÑом запÑоÑе не бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð½Ð¾Ð²Ð¾Ð²Ð²ÐµÐ´ÑннÑй опеÑаÑоÑ. ÐÑи ÑазбоÑе запÑоÑа ÑнаÑала бÑÐ´ÐµÑ Ð¿ÑовеÑено, еÑÑÑ Ð»Ð¸ опеÑаÑÐ¾Ñ mytext = mytext (Ñм. Шаг 2.a), но ÑÑо не Ñак; заÑем бÑÐ´ÐµÑ ÑаÑÑмоÑÑен базовÑй Ñип домена (text) и пÑовеÑено налиÑие опеÑаÑоÑа text = text (Ñм. Шаг 2.b), и Ñаковой дейÑÑвиÑелÑно еÑÑÑ; в иÑоге ÑÑÑоковое знаÑение Ñипа unknown бÑÐ´ÐµÑ Ð²Ð¾ÑпÑинÑÑо как text и бÑÐ´ÐµÑ Ð¿ÑименÑн опеÑаÑÐ¾Ñ text = text. ÐдинÑÑвеннÑй ваÑÐ¸Ð°Ð½Ñ Ð·Ð°Ð´ÐµÐ¹ÑÑвоваÑÑ Ð½Ð¾Ð²Ð¾Ð²Ð²ÐµÐ´ÑннÑй опеÑаÑÐ¾Ñ â добавиÑÑ Ñвное пÑиведение:
SELECT * FROM mytable WHERE val = text 'foo';
Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ mytext = text бÑл найден ÑÑазÑ, ÑоглаÑно пÑÐ°Ð²Ð¸Ð»Ñ ÑоÑного ÑовпадениÑ. ÐÑли дело доÑ
Ð¾Ð´Ð¸Ñ Ð´Ð¾ пÑавил наиболÑÑего ÑооÑвеÑÑÑвиÑ, они акÑивно диÑкÑедиÑиÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð½ÑÑ
Ñипов. ÐÑли Ð±Ñ Ð¾Ð½Ð¸ ÑÑого не делали, Ñ Ñаким опеÑаÑоÑом возникало Ð±Ñ ÑлиÑком много оÑибок ÑазÑеÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов, поÑÐ¾Ð¼Ñ ÑÑо пÑавила пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð²Ñегда ÑÑиÑаÑÑ Ð´Ð¾Ð¼ÐµÐ½ пÑиводимÑм к Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð¸ наобоÑоÑ, Ñак ÑÑо доменнÑй опеÑаÑÐ¾Ñ Ð¿ÑименÑлÑÑ Ð±Ñ Ð²Ð¾ вÑеÑ
ÑлÑÑаÑÑ
, где пÑименÑеÑÑÑ Ð¾Ð´Ð½Ð¾Ð¸Ð¼ÑннÑй опеÑаÑÐ¾Ñ Ñ Ð±Ð°Ð·Ð¾Ð²Ñм Ñипом.
[9] ÐÑа ÑгÑоза неакÑÑалÑна Ð´Ð»Ñ Ð¸Ð¼Ñн без ÑÑ ÐµÐ¼Ñ, Ñак как пÑÑÑ Ð¿Ð¾Ð¸Ñка, ÑодеÑжаÑий ÑÑ ÐµÐ¼Ñ, в коÑоÑÑÑ Ð½ÐµÐ´Ð¾Ð²ÐµÑеннÑе полÑзоваÑели могÑÑ ÑоздаваÑÑ Ð¾Ð±ÑекÑÑ, не ÑооÑвеÑÑÑвÑÐµÑ ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑ ÐµÐ¼.