10.5. UNION, CASE и ÑвÑзаннÑе конÑÑÑÑкÑии #
SQL-конÑÑÑÑкÑÐ¸Ñ UNION взаимодейÑÑвÑÐµÑ Ñ ÑиÑÑемой Ñипов, Ñак как ей пÑиÑ
одиÑÑÑ Ð¾Ð±ÑединÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ ÑазлиÑнÑÑ
Ñипов в единÑй ÑезÑлÑÑиÑÑÑÑий набоÑ. ÐлгоÑиÑм ÑазÑеÑÐµÐ½Ð¸Ñ Ñипов пÑи ÑÑом пÑименÑеÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо к ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð²ÑÑ
Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ Ð·Ð°Ð¿ÑоÑа. ÐонÑÑÑÑкÑии INTERSECT и EXCEPT ÑопоÑÑавлÑÑÑ ÑазлиÑнÑе ÑÐ¸Ð¿Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ UNION. Ðо ÑÐ°ÐºÐ¾Ð¼Ñ Ð¶Ðµ алгоÑиÑÐ¼Ñ ÑопоÑÑавлÑÑÑ ÑÐ¸Ð¿Ñ Ð²ÑÑажений и опÑеделÑÑÑ Ñип Ñвоего ÑезÑлÑÑаÑа некоÑоÑÑе дÑÑгие конÑÑÑÑкÑии, вклÑÑÐ°Ñ CASE, ARRAY, VALUES и ÑÑнкÑии GREATEST и LEAST.
РазÑеÑение Ñипов Ð´Ð»Ñ UNION, CASE и ÑвÑзаннÑÑ
конÑÑÑÑкÑий
ÐÑли вÑе даннÑе одного Ñипа и ÑÑо не Ñип
unknown, вÑбÑаÑÑ ÐµÐ³Ð¾.ÐÑли Ñип даннÑÑ â домен, далее ÑÑиÑаÑÑ Ð¸Ñ Ñипом базовÑй Ñип домена. [12]
ÐÑли вÑе даннÑе Ñипа
unknown, вÑбÑаÑÑ Ð´Ð»Ñ ÑезÑлÑÑаÑа Ñипtext(пÑедпоÑиÑаемÑй Ð´Ð»Ñ ÐºÐ°ÑегоÑии string). РпÑоÑивном ÑлÑÑае знаÑениÑunknownÐ´Ð»Ñ Ð¾ÑÑалÑнÑÑ Ð¿Ñавил игноÑиÑÑÑÑÑÑ.ÐÑли извеÑÑнÑе ÑÐ¸Ð¿Ñ Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¾ÐºÐ°Ð·ÑваÑÑÑÑ Ð½Ðµ из одной каÑегоÑии, конÑÑаÑиÑоваÑÑ Ð½ÐµÑдаÑÑ.
ÐÑбÑаÑÑ Ð¿ÐµÑвÑй извеÑÑнÑй Ñип даннÑÑ Ð² каÑеÑÑве Ñипа-кандидаÑа, заÑем ÑаÑÑмоÑÑеÑÑ Ð²Ñе оÑÑалÑнÑе извеÑÑнÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , Ñлева напÑаво. [13] ÐÑли Ñанее вÑбÑаннÑй Ñип Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑвно пÑеобÑазован к дÑÑÐ³Ð¾Ð¼Ñ ÑипÑ, но пÑеобÑазоваÑÑ Ð²ÑоÑой в пеÑвÑй нелÑзÑ, вÑбÑаÑÑ Ð²ÑоÑой Ñип в каÑеÑÑве нового кандидаÑа. ÐаÑем пÑодолжаÑÑ ÑаÑÑмоÑÑение поÑледÑÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑли на лÑбом ÑÑапе ÑÑого пÑоÑеÑÑа вÑбиÑаеÑÑÑ Ð¿ÑедпоÑиÑаемÑй Ñип, ÑледÑÑÑие даннÑе болÑÑе не ÑаÑÑмаÑÑиваÑÑÑÑ.
ÐÑивеÑÑи вÑе даннÑе к оконÑаÑелÑно вÑбÑÐ°Ð½Ð½Ð¾Ð¼Ñ ÑипÑ. ÐонÑÑаÑиÑоваÑÑ Ð½ÐµÑдаÑÑ, еÑли неÑвное пÑеобÑазование из Ñипа Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð² вÑбÑаннÑй Ñип невозможно.
Ðиже ÑÑо пÑоиллÑÑÑÑиÑовано на пÑимеÑÐ°Ñ .
ÐÑÐ¸Ð¼ÐµÑ 10.10. РазÑеÑение Ñипов Ñ ÑаÑÑиÑнÑм опÑеделением в Union
SELECT text 'a' AS "text" UNION SELECT 'b'; text ------ a b (2 rows)
Рданном ÑлÑÑае конÑÑанÑа 'b' неизвеÑÑного Ñипа бÑÐ´ÐµÑ Ð¿ÑеобÑазована в Ñип text.
ÐÑÐ¸Ð¼ÐµÑ 10.11. РазÑеÑение Ñипов в пÑоÑÑом обÑединении
SELECT 1.2 AS "numeric" UNION SELECT 1;
numeric
---------
1
1.2
(2 rows)
ÐонÑÑанÑа 1.2 Ð¸Ð¼ÐµÐµÑ Ñип numeric и ÑелоÑиÑленное знаÑение 1 Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑвно пÑиведено к ÑÐ¸Ð¿Ñ numeric, Ñак ÑÑо иÑполÑзÑеÑÑÑ ÑÑÐ¾Ñ Ñип.
ÐÑÐ¸Ð¼ÐµÑ 10.12. РазÑеÑение Ñипов в пÑоÑивоположном обÑединении
SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL);
real
------
1
2.2
(2 rows)
ÐдеÑÑ Ð·Ð½Ð°Ñение Ñипа real нелÑÐ·Ñ Ð½ÐµÑвно пÑивеÑÑи к integer, но integer можно неÑвно пÑивеÑÑи к real, поÑÑÐ¾Ð¼Ñ Ñипом ÑезÑлÑÑаÑа обÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ real.
ÐÑÐ¸Ð¼ÐµÑ 10.13. РазÑеÑение Ñипов во вложенном обÑединении
SELECT NULL UNION SELECT NULL UNION SELECT 1; ERROR: UNION types text and integer cannot be matched
ÐÑа оÑибка Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¸Ð·-за Ñого, ÑÑо PostgreSQL воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑвеннÑе UNION как паÑÑ Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñми опеÑаÑиÑми, Ñо еÑÑÑ ÐºÐ°Ðº запиÑÑ
(SELECT NULL UNION SELECT NULL) UNION SELECT 1;
ÐнÑÑÑенний UNION ÑазÑеÑаеÑÑÑ ÐºÐ°Ðº вÑдаÑÑий Ñип text, ÑоглаÑно пÑавилам, пÑиведÑннÑм вÑÑе. ÐаÑем внеÑний UNION полÑÑÐ°ÐµÑ Ð½Ð° вÑ
од ÑÐ¸Ð¿Ñ text и integer, ÑÑо и пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº показанной оÑибке. ÐÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑÑÑÑаниÑÑ, Ñделав Ñак, ÑÑÐ¾Ð±Ñ Ñ Ñамого левого UNION минимÑм Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑоÑÐ¾Ð½Ñ Ð±Ñли даннÑе желаемого Ñипа ÑезÑлÑÑаÑа.
ÐпеÑаÑии INTERSECT и EXCEPT Ñакже ÑазÑеÑаÑÑÑÑ Ð¿Ð¾ паÑам. Ðднако оÑÑалÑнÑе конÑÑÑÑкÑии, опиÑаннÑе в ÑÑом Ñазделе, ÑаÑÑмаÑÑиваÑÑ Ð²Ñе вÑ
однÑе даннÑе ÑÑазÑ.
[12] Так же, как Ð´Ð¾Ð¼ÐµÐ½Ñ Ð²Ð¾ÑпÑинимаÑÑÑÑ Ð¿Ñи вÑбоÑе опеÑаÑоÑов и ÑÑнкÑий, доменнÑе ÑÐ¸Ð¿Ñ Ð¼Ð¾Ð³ÑÑ ÑоÑ
ÑанÑÑÑÑÑ Ð² конÑÑÑÑкÑии UNION или подобной, еÑли полÑзоваÑÐµÐ»Ñ Ð¿Ð¾Ð·Ð°Ð±Ð¾ÑиÑÑÑ Ð¾ Ñом, ÑÑÐ¾Ð±Ñ Ð²Ñе вÑ
однÑе даннÑе пÑиводилиÑÑ Ðº ÑÑÐ¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ñвно или неÑвно. РпÑоÑивном ÑлÑÑае бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ñй Ñип домена.
[13] Ðо иÑÑоÑиÑеÑким пÑиÑинам в конÑÑÑÑкÑии CASE вÑÑажение в пÑедложении ELSE (еÑли оно еÑÑÑ) обÑабаÑÑваеÑÑÑ ÐºÐ°Ðº «пеÑвое», а пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ THEN ÑаÑÑмаÑÑиваÑÑÑÑ Ð¿Ð¾Ñле. Ðо вÑеÑ
оÑÑалÑнÑÑ
ÑлÑÑаÑÑ
, «Ñлева напÑаво» ознаÑÐ°ÐµÑ Ð¿Ð¾ÑÑдок, в коÑоÑом вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´ÐµÐ¹ÑÑвиÑелÑно идÑÑ Ð² ÑекÑÑе запÑоÑа.