10.5. UNION, CASE и ÑвÑзаннÑе конÑÑÑÑкÑии
SQL-конÑÑÑÑкÑÐ¸Ñ UNION взаимодейÑÑвÑÐµÑ Ñ ÑиÑÑемой Ñипов, Ñак как ей пÑиÑ
одиÑÑÑ Ð¾Ð±ÑединÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ ÑазлиÑнÑÑ
Ñипов в единÑй ÑезÑлÑÑиÑÑÑÑий набоÑ. ÐлгоÑиÑм ÑазÑеÑÐµÐ½Ð¸Ñ Ñипов пÑи ÑÑом пÑименÑеÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо к ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¾ÑделÑÐ½Ð¾Ð¼Ñ ÑÑолбÑÑ Ð·Ð°Ð¿ÑоÑа. ÐодобнÑм обÑазом ÑазлиÑнÑе ÑÐ¸Ð¿Ñ ÑопоÑÑавлÑÑÑÑÑ Ð¿Ñи вÑполнении INTERSECT и EXCEPT ÑопоÑÑавлÑÑÑ ÑазлиÑнÑе ÑÐ¸Ð¿Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ UNION. Ðо ÑÐ°ÐºÐ¾Ð¼Ñ Ð¶Ðµ алгоÑиÑÐ¼Ñ ÑопоÑÑавлÑÑÑ ÑÐ¸Ð¿Ñ Ð²ÑÑажений и опÑеделÑÑÑ Ñип Ñвоего ÑезÑлÑÑаÑа конÑÑÑÑкÑии CASE, ARRAY, VALUES, GREATEST и LEAST.
РазÑеÑение Ñипов Ð´Ð»Ñ UNION, CASE и ÑвÑзаннÑÑ
конÑÑÑÑкÑий
ÐÑли вÑе даннÑе одного Ñипа и ÑÑо не Ñип
unknown, вÑбÑаÑÑ ÐµÐ³Ð¾.ÐÑли Ñип даннÑÑ â домен, далее ÑÑиÑаÑÑ Ð¸Ñ Ñипом базовÑй Ñип домена. [11]
ÐÑли вÑе даннÑе Ñипа
unknown, вÑбÑаÑÑ Ð´Ð»Ñ ÑезÑлÑÑаÑа Ñипtext(пÑедпоÑиÑаемÑй Ð´Ð»Ñ ÐºÐ°ÑегоÑии string). РпÑоÑивном ÑлÑÑае знаÑениÑunknownигноÑиÑÑÑÑÑÑ.ÐÑли извеÑÑнÑе ÑÐ¸Ð¿Ñ Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¾ÐºÐ°Ð·ÑваÑÑÑÑ Ð½Ðµ из одной каÑегоÑии, конÑÑаÑиÑоваÑÑ Ð½ÐµÑдаÑÑ.
ÐÑбÑаÑÑ Ð¿ÐµÑвÑй извеÑÑнÑй пÑедпоÑиÑаемÑй Ñип из ÑÑой каÑегоÑии, еÑли Ñакой еÑÑÑ.
РпÑоÑивном ÑлÑÑае вÑбÑаÑÑ Ð¿Ð¾Ñледний извеÑÑнÑй Ñип, в коÑоÑÑй можно неÑвно пÑеобÑазоваÑÑ Ð²Ñе даннÑе пÑедÑеÑÑвÑÑÑÐ¸Ñ Ð¸Ð·Ð²ÐµÑÑнÑÑ Ñипов. (Такой Ñип еÑÑÑ Ð²Ñегда, в кÑайнем ÑлÑÑае ÑÑÐ¾Ð¼Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ ÑдовлеÑвоÑÑÐµÑ Ð¿ÐµÑвÑй Ñип.)
ÐÑивеÑÑи вÑе даннÑе к вÑбÑанном ÑипÑ. ÐонÑÑаÑиÑоваÑÑ Ð½ÐµÑдаÑÑ, еÑли Ð´Ð»Ñ ÐºÐ°ÐºÐ¸Ñ -либо даннÑÑ Ð¿ÑеобÑазование в ÑÑÐ¾Ñ Ñип невозможно.
Ðиже ÑÑо пÑоиллÑÑÑÑиÑовано на пÑимеÑÐ°Ñ .
ÐÑÐ¸Ð¼ÐµÑ 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
ÐÑа оÑибка Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¸Ð·-за Ñого, ÑÑо Postgres Pro воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑвеннÑе UNION как паÑÑ Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñми опеÑаÑиÑми, Ñо еÑÑÑ ÐºÐ°Ðº запиÑÑ
(SELECT NULL UNION SELECT NULL) UNION SELECT 1;
ÐнÑÑÑенний UNION ÑазÑеÑаеÑÑÑ ÐºÐ°Ðº вÑдаÑÑий Ñип text, ÑоглаÑно пÑавилам, пÑиведÑннÑм вÑÑе. ÐаÑем внеÑний UNION полÑÑÐ°ÐµÑ Ð½Ð° вÑ
од ÑÐ¸Ð¿Ñ text и integer, ÑÑо и пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº показанной оÑибке. ÐÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑÑÑÑаниÑÑ, Ñделав Ñак, ÑÑÐ¾Ð±Ñ Ñ Ñамого левого UNION минимÑм Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑоÑÐ¾Ð½Ñ Ð±Ñли даннÑе желаемого Ñипа ÑезÑлÑÑаÑа.
ÐпеÑаÑии INTERSECT и EXCEPT Ñакже ÑазÑеÑаÑÑÑÑ Ð¿Ð¾ паÑам. Ðднако оÑÑалÑнÑе конÑÑÑÑкÑии, опиÑаннÑе в ÑÑом Ñазделе, ÑаÑÑмаÑÑиваÑÑ Ð²Ñе вÑ
однÑе даннÑе ÑÑазÑ.
[11] Так же, как Ð´Ð¾Ð¼ÐµÐ½Ñ Ð²Ð¾ÑпÑинимаÑÑÑÑ Ð¿Ñи вÑбоÑе опеÑаÑоÑов и ÑÑнкÑий, доменнÑе ÑÐ¸Ð¿Ñ Ð¼Ð¾Ð³ÑÑ ÑоÑ
ÑанÑÑÑÑÑ Ð² конÑÑÑÑкÑии UNION или подобной, еÑли полÑзоваÑÐµÐ»Ñ Ð¿Ð¾Ð·Ð°Ð±Ð¾ÑиÑÑÑ Ð¾ Ñом, ÑÑÐ¾Ð±Ñ Ð²Ñе вÑ
однÑе даннÑе пÑиводилиÑÑ Ðº ÑÑÐ¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ñвно или неÑвно. РпÑоÑивном ÑлÑÑае пÑедпоÑÑение бÑÐ´ÐµÑ Ð¾Ñдано Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°.