8.16. СоÑÑавнÑе ÑипÑ
- 8.16.1. ÐбÑÑвление ÑоÑÑавнÑÑ
Ñипов
- 8.16.2. ÐонÑÑÑÑиÑование ÑоÑÑавнÑÑ Ð·Ð½Ð°Ñений
- 8.16.3. ÐбÑаÑение к ÑоÑÑавнÑм Ñипам
- 8.16.4. Ðзменение ÑоÑÑавнÑÑ Ñипов
- 8.16.5. ÐÑполÑзование ÑоÑÑавнÑÑ Ñипов в запÑоÑаÑ
- 8.16.6. СинÑакÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼ÑÑ Ð¸ вÑводимÑÑ Ð·Ð½Ð°Ñений ÑоÑÑавного Ñипа
- 8.16.2. ÐонÑÑÑÑиÑование ÑоÑÑавнÑÑ Ð·Ð½Ð°Ñений
СоÑÑавной Ñип пÑедÑÑавлÑÐµÑ ÑÑÑÑкÑÑÑÑ ÑаблиÑной ÑÑÑоки или запиÑи; по ÑÑÑи ÑÑо пÑоÑÑо ÑпиÑок имÑн полей и ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ñипов даннÑÑ . Postgres Pro позволÑÐµÑ Ð¸ÑполÑзоваÑÑ ÑоÑÑавнÑе ÑÐ¸Ð¿Ñ Ð²Ð¾ многом Ñак же, как и пÑоÑÑÑе ÑипÑ. ÐапÑимеÑ, в опÑеделении ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ обÑÑвиÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ ÑоÑÑавного Ñипа.
8.16.1. ÐбÑÑвление ÑоÑÑавнÑÑ Ñипов
Ðиже пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð´Ð²Ð° пÑоÑÑÑÑ Ð¿ÑимеÑа опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑоÑÑавнÑÑ Ñипов:
CREATE TYPE complex AS (
r double precision,
i double precision
);
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
); СинÑакÑÐ¸Ñ Ð¾ÑÐµÐ½Ñ Ð¿Ð¾Ñ
ож на CREATE TABLE, за иÑклÑÑением Ñого, ÑÑо он допÑÑÐºÐ°ÐµÑ ÑолÑко Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ и иÑ
ÑипÑ, какие-либо огÑаниÑÐµÐ½Ð¸Ñ (Ñакие как NOT NULL) в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ поддеÑживаÑÑÑÑ. ÐамеÑÑÑе, ÑÑо клÑÑевое Ñлово AS здеÑÑ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение; без него ÑиÑÑема бÑÐ´ÐµÑ ÑÑиÑаÑÑ, ÑÑо подÑазÑмеваеÑÑÑ Ð´ÑÑгой Ñип ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE TYPE, и вÑдаÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½ÑÑ ÑинÑакÑиÑеÑкÑÑ Ð¾ÑибкÑ.
ÐпÑеделив Ñакие ÑипÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð¸Ñ Ð² ÑаблиÑÐ°Ñ :
CREATE TABLE on_hand (
item inventory_item,
count integer
);
INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);или ÑÑнкÑиÑÑ :
CREATE FUNCTION price_extension(inventory_item, integer) RETURNS numeric AS 'SELECT $1.price * $2' LANGUAGE SQL; SELECT price_extension(item, 10) FROM on_hand;
ÐÑÑкий Ñаз, когда ÑоздаÑÑÑÑ ÑаблиÑа, вмеÑÑе Ñ Ð½ÐµÐ¹ авÑомаÑиÑеÑки ÑоздаÑÑÑÑ ÑоÑÑавной Ñип. ÐÑÐ¾Ñ Ñип пÑедÑÑавлÑÐµÑ Ñип ÑÑÑоки ÑаблиÑÑ, и его именем ÑÑановиÑÑÑ Ð¸Ð¼Ñ ÑаблиÑÑ. ÐапÑимеÑ, пÑи вÑполнении командÑ:
CREATE TABLE inventory_item (
name text,
supplier_id integer REFERENCES suppliers,
price numeric CHECK (price > 0)
); в каÑеÑÑве побоÑного ÑÑÑекÑа бÑÐ´ÐµÑ Ñоздан ÑоÑÑавной Ñип inventory_item, в ÑоÑноÑÑи ÑооÑвеÑÑÑвÑÑÑий ÑомÑ, ÑÑо бÑл показан вÑÑе, и иÑполÑзоваÑÑ ÐµÐ³Ð¾ можно Ñак же. Ðднако замеÑÑÑе, ÑÑо в ÑекÑÑей ÑеализаÑии еÑÑÑ Ð¾Ð´Ð¸Ð½ недоÑÑаÑок: Ñак как Ñ ÑоÑÑавнÑм Ñипом не могÑÑ Ð±ÑÑÑ ÑвÑÐ·Ð°Ð½Ñ Ð¾Ð³ÑаниÑениÑ, Ñо опиÑаннÑе в опÑеделении ÑаблиÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð½Ðµ пÑименÑÑÑÑÑ Ðº знаÑениÑм ÑоÑÑавного Ñипа вне ÑаблиÑÑ. (ЧÑÐ¾Ð±Ñ Ð¾Ð±Ð¾Ð¹Ñи ÑÑÐ¾Ñ Ð½ÐµÐ´Ð¾ÑÑаÑок, ÑоздайÑе домен повеÑÑ
ÑоÑÑавного Ñипа и добавÑÑе желаемÑе огÑаниÑÐµÐ½Ð¸Ñ Ð² виде огÑаниÑений CHECK Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ домена.)
8.16.2. ÐонÑÑÑÑиÑование ÑоÑÑавнÑÑ Ð·Ð½Ð°Ñений
ЧÑÐ¾Ð±Ñ Ð·Ð°Ð¿Ð¸ÑаÑÑ Ð·Ð½Ð°Ñение ÑоÑÑавного Ñипа в виде ÑекÑÑовой конÑÑанÑÑ, его Ð¿Ð¾Ð»Ñ Ð½Ñжно заклÑÑиÑÑ Ð² кÑÑглÑе Ñкобки и ÑазделиÑÑ Ð¸Ñ Ð·Ð°Ð¿ÑÑÑми. ÐнаÑение лÑбого Ð¿Ð¾Ð»Ñ Ð¼Ð¾Ð¶Ð½Ð¾ заклÑÑиÑÑ Ð² кавÑÑки, а еÑли оно ÑодеÑÐ¶Ð¸Ñ Ð·Ð°Ð¿ÑÑÑе или Ñкобки, ÑÑо делаÑÑ Ð¾Ð±ÑзаÑелÑно. (ÐодÑобнее об ÑÑом говоÑиÑÑÑ Ð½Ð¸Ð¶Ðµ.) Таким обÑазом, в обÑем виде конÑÑанÑа ÑоÑÑавного Ñипа запиÑÑваеÑÑÑ Ñак:
'(знаÑение1,знаÑение2, ... )'
ÐапÑимеÑ, ÑÑа запиÑÑ:
'("fuzzy dice",42,1.99)' бÑÐ´ÐµÑ Ð´Ð¾Ð¿ÑÑÑимой Ð´Ð»Ñ Ð¾Ð¿Ð¸Ñанного вÑÑе Ñипа inventory_item. ЧÑÐ¾Ð±Ñ Ð¿ÑиÑвоиÑÑ NULL Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð· полей, в ÑооÑвеÑÑÑвÑÑÑем меÑÑе в ÑпиÑке нÑжно оÑÑавиÑÑ Ð¿ÑÑÑое меÑÑо. ÐапÑимеÑ, ÑÑа конÑÑанÑа задаÑÑ Ð·Ð½Ð°Ñение NULL Ð´Ð»Ñ ÑÑеÑÑего полÑ:
'("fuzzy dice",42,)'ÐÑли же вмеÑÑо NULL ÑÑебÑеÑÑÑ Ð²ÑÑавиÑÑ Ð¿ÑÑÑÑÑ ÑÑÑокÑ, нÑжно запиÑаÑÑ Ð¿Ð°ÑÑ ÐºÐ°Ð²ÑÑек:
'("",42,)'ÐдеÑÑ Ð² пеÑвом поле окажеÑÑÑ Ð¿ÑÑÑÐ°Ñ ÑÑÑока, а в ÑÑеÑÑем â NULL.
(Такого Ñода конÑÑанÑÑ Ð¼Ð°ÑÑивов на Ñамом деле пÑедÑÑавлÑÑÑ Ñобой вÑего лиÑÑ ÑаÑÑнÑй ÑлÑÑай конÑÑанÑ, опиÑаннÑÑ Ð² ÐодÑазделе 4.1.2.7. ÐонÑÑанÑа изнаÑалÑно воÑпÑинимаеÑÑÑ ÐºÐ°Ðº ÑÑÑока и пеÑедаÑÑÑÑ Ð¿ÑоÑедÑÑе пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑоÑÑавного Ñипа. ÐÑи ÑÑом Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ñвно ÑказаÑÑ Ñип, к коÑоÑÐ¾Ð¼Ñ Ð±ÑÐ´ÐµÑ Ð¿Ñиведена конÑÑанÑа.)
ÐнаÑÐµÐ½Ð¸Ñ ÑоÑÑавнÑÑ
Ñипов Ñакже можно конÑÑÑÑиÑоваÑÑ, иÑполÑзÑÑ ÑинÑакÑÐ¸Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ROW. РболÑÑинÑÑве ÑлÑÑаев ÑÑо знаÑиÑелÑно пÑоÑе, Ñем запиÑÑваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² ÑÑÑоке, Ñак как пÑи ÑÑом не нÑжно беÑпокоиÑÑÑÑ Ð¾ вложенноÑÑи кавÑÑек. ÐÑ Ñже обÑÑждали ÑÑÐ¾Ñ Ð¼ÐµÑод Ñанее:
ROW('fuzzy dice', 42, 1.99)
ROW('', 42, NULL)ÐлÑÑевое Ñлово ROW на Ñамом деле Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑм, еÑли в вÑÑажении опÑеделÑÑÑÑÑ Ð½ÐµÑколÑко полей, Ñак ÑÑо ÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑпÑоÑÑиÑÑ Ð´Ð¾:
('fuzzy dice', 42, 1.99)
('', 42, NULL) СинÑакÑÐ¸Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ROW более подÑобно ÑаÑÑмаÑÑиваеÑÑÑ Ð² ÐодÑазделе 4.2.13.
8.16.3. ÐбÑаÑение к ÑоÑÑавнÑм Ñипам
ЧÑÐ¾Ð±Ñ Ð¾Ð±ÑаÑиÑÑÑÑ Ðº Ð¿Ð¾Ð»Ñ ÑÑолбÑа ÑоÑÑавного Ñипа, поÑле имени ÑÑолбÑа нÑжно добавиÑÑ ÑоÑÐºÑ Ð¸ Ð¸Ð¼Ñ Ð¿Ð¾Ð»Ñ, подобно ÑомÑ, как ÑказÑваеÑÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ Ð¿Ð¾Ñле имени ÑаблиÑÑ. Ðа Ñамом деле, ÑÑи обÑаÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¾ÑлиÑимÑ, Ñак ÑÑо ÑаÑÑо бÑÐ²Ð°ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимо иÑполÑзоваÑÑ Ñкобки, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° бÑла ÑазобÑана пÑавилÑно. ÐапÑимеÑ, можно попÑÑаÑÑÑÑ Ð²ÑбÑаÑÑ Ð¿Ð¾Ð»Ðµ ÑÑолбÑа из ÑеÑÑовой ÑаблиÑÑ on_hand Ñаким обÑазом:
SELECT item.name FROM on_hand WHERE item.price > 9.99;
Ðо ÑÑо не бÑÐ´ÐµÑ ÑабоÑаÑÑ, Ñак как ÑоглаÑно пÑавилам SQL Ð¸Ð¼Ñ item здеÑÑ Ð²Ð¾ÑпÑинимаеÑÑÑ ÐºÐ°Ðº Ð¸Ð¼Ñ ÑаблиÑÑ, а не ÑÑолбÑа в ÑаблиÑе on_hand. ÐоÑÑÐ¾Ð¼Ñ ÑÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ñжно пеÑепиÑаÑÑ Ñак:
SELECT (item).name FROM on_hand WHERE (item).price > 9.99;
либо ÑказаÑÑ Ñакже и Ð¸Ð¼Ñ ÑаблиÑÑ (напÑимеÑ, в запÑоÑе Ñ Ð¼Ð½Ð¾Ð³Ð¸Ð¼Ð¸ ÑаблиÑами), пÑимеÑно Ñак:
SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;
Ð ÑезÑлÑÑаÑе обÑÐµÐºÑ Ð² ÑкобкаÑ
бÑÐ´ÐµÑ Ð¿ÑавилÑно инÑеÑпÑеÑиÑован как ÑÑÑлка на ÑÑÐ¾Ð»Ð±ÐµÑ item, из коÑоÑого вÑбиÑаеÑÑÑ Ð¿Ð¾Ð»Ðµ.
ÐÑи вÑбоÑке Ð¿Ð¾Ð»Ñ Ð¸Ð· знаÑÐµÐ½Ð¸Ñ ÑоÑÑавного Ñипа Ñакже Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе ÑинÑакÑиÑеÑкие казÑÑÑ. ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ Ð²ÑбÑаÑÑ Ð¾Ð´Ð½Ð¾ поле из ÑезÑлÑÑаÑа ÑÑнкÑии, возвÑаÑаÑÑей ÑоÑÑавное знаÑение, поÑÑебÑеÑÑÑ Ð½Ð°Ð¿Ð¸ÑаÑÑ ÑÑо-Ñо подобное:
SELECT (my_func(...)).field FROM ...
Ðез дополниÑелÑнÑÑ Ñкобок в ÑÑом запÑоÑе пÑоизойдÑÑ ÑинÑакÑиÑеÑÐºÐ°Ñ Ð¾Ñибка.
СпеÑиалÑное Ð¸Ð¼Ñ Ð¿Ð¾Ð»Ñ * ознаÑÐ°ÐµÑ Â«Ð²Ñе полÑ»; подÑобнее об ÑÑом ÑаÑÑказÑваеÑÑÑ Ð² ÐодÑазделе 8.16.5.
8.16.4. Ðзменение ÑоÑÑавнÑÑ Ñипов
Ðиже пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð¿ÑимеÑÑ Ð¿ÑавилÑнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений ÑоÑÑавнÑÑ ÑÑолбÑов. ÐеÑвÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¸Ð»Ð»ÑÑÑÑиÑÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ или изменение вÑего ÑÑолбÑа:
INSERT INTO mytab (complex_col) VALUES((1.1,2.2)); UPDATE mytab SET complex_col = ROW(1.1,2.2) WHERE ...;
РпеÑвом пÑимеÑе опÑÑено клÑÑевое Ñлово ROW, а во вÑоÑом оно еÑÑÑ; пÑиÑÑÑÑÑвоваÑÑ Ð¸Ð»Ð¸ оÑÑÑÑÑÑвоваÑÑ Ð¾Ð½Ð¾ Ð¼Ð¾Ð¶ÐµÑ Ð² обоиÑ
ÑлÑÑаÑÑ
.
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ измениÑÑ Ñакже оÑделÑное поле ÑоÑÑавного ÑÑолбÑа:
UPDATE mytab SET complex_col.r = (complex_col).r + 1 WHERE ...;
ÐамеÑÑÑе, ÑÑо пÑи ÑÑом не нÑжно (и на Ñамом деле даже нелÑзÑ) заклÑÑаÑÑ Ð² Ñкобки Ð¸Ð¼Ñ ÑÑолбÑа, ÑледÑÑÑее ÑÑÐ°Ð·Ñ Ð·Ð° пÑедложением SET, но в ÑÑÑлке на ÑÐ¾Ñ Ð¶Ðµ ÑÑÐ¾Ð»Ð±ÐµÑ Ð² вÑÑажении, наÑ
одÑÑемÑÑ Ð¿Ð¾ пÑавÑÑ ÑÑоÑÐ¾Ð½Ñ Ð·Ð½Ð°ÐºÐ° ÑавенÑÑва, Ñкобки обÑзаÑелÑнÑ.
Ð Ð¼Ñ Ñакже можем ÑказаÑÑ Ð¿Ð¾Ð»Ñ Ð² каÑеÑÑве Ñели ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ INSERT:
INSERT INTO mytab (complex_col.r, complex_col.i) VALUES(1.1, 2.2);
ÐÑли пÑи ÑÑом Ð¼Ñ Ð½Ðµ Ñкажем знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²ÑÐµÑ Ð¿Ð¾Ð»ÐµÐ¹ ÑÑолбÑа, оÑÑавÑиеÑÑ Ð¿Ð¾Ð»Ñ Ð±ÑдÑÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð·Ð½Ð°ÑениÑми NULL.
8.16.5. ÐÑполÑзование ÑоÑÑавнÑÑ Ñипов в запÑоÑаÑ
С ÑоÑÑавнÑми Ñипами в запÑоÑÐ°Ñ ÑвÑÐ·Ð°Ð½Ñ Ð¾ÑобÑе пÑавила ÑинÑакÑиÑа и поведение. ÐÑи пÑавила обÑазÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñе конÑÑÑÑкÑии, но они могÑÑ Ð±ÑÑÑ Ð½ÐµÐ¾ÑевиднÑми, еÑли не понимаÑÑ ÑÑоÑÑÑÑ Ð·Ð° ними логикÑ.
Ð Postgres Pro ÑÑÑлка на Ð¸Ð¼Ñ ÑаблиÑÑ (или ÐµÑ Ð¿Ñевдоним) в запÑоÑе по ÑÑÑи ÑвлÑеÑÑÑ ÑÑÑлкой на ÑоÑÑавное знаÑение ÑекÑÑей ÑÑÑоки в ÑÑой ÑаблиÑе. ÐапÑимеÑ, Ð¸Ð¼ÐµÑ ÑаблиÑÑ inventory_item, показаннÑÑ Ð²ÑÑе, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ напиÑаÑÑ:
SELECT c FROM inventory_item c;
ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð²ÑдаÑÑ Ð¾Ð´Ð¸Ð½ ÑÑÐ¾Ð»Ð±ÐµÑ Ñ ÑоÑÑавнÑм знаÑением, и его ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñаким:
c
------------------------
("fuzzy dice",42,1.99)
(1 row) ÐамеÑÑÑе, однако, ÑÑо пÑоÑÑÑе имена ÑопоÑÑавлÑÑÑÑÑ ÑнаÑала Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ ÑÑолбÑов, и ÑолÑко поÑом Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ ÑаблиÑ, Ñак ÑÑо Ñакой ÑезÑлÑÑÐ°Ñ Ð¿Ð¾Ð»ÑÑаеÑÑÑ ÑолÑко поÑомÑ, ÑÑо в ÑаблиÑаÑ
запÑоÑа не оказалоÑÑ ÑÑолбÑа Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ c.
ÐбÑÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ имени ÑÑолбÑа вида имÑ_ÑаблиÑÑ.имÑ_ÑÑолбÑа можно понимаÑÑ ÐºÐ°Ðº пÑименение вÑбоÑа Ð¿Ð¾Ð»Ñ Ðº ÑоÑÑÐ°Ð²Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑекÑÑей ÑÑÑоки ÑаблиÑÑ. (Ðз ÑообÑажений ÑÑÑекÑивноÑÑи на Ñамом деле ÑÑо Ñеализовано по-дÑÑгомÑ.)
Ðогда Ð¼Ñ Ð¿Ð¸Ñем
SELECT c.* FROM inventory_item c;
Ñо, ÑоглаÑно ÑÑандаÑÑÑ SQL, Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑодеÑжимое ÑаблиÑÑ, ÑазвÑÑнÑÑое в оÑделÑнÑе ÑÑолбÑÑ:
name | supplier_id | price ------------+-------------+------- fuzzy dice | 42 | 1.99 (1 row)
как Ñ Ð·Ð°Ð¿ÑоÑом
SELECT c.name, c.supplier_id, c.price FROM inventory_item c;
Postgres Pro пÑименÑÐµÑ Ñакое ÑазвÑÑÑÑвание Ð´Ð»Ñ Ð»ÑбÑÑ
вÑÑажений Ñ ÑоÑÑавнÑми знаÑениÑми, Ñ
оÑÑ ÐºÐ°Ðº показано вÑÑе, необÑ
одимо заклÑÑиÑÑ Ð² Ñкобки знаÑение, к коÑоÑÐ¾Ð¼Ñ Ð¿ÑименÑеÑÑÑ .*, еÑли ÑолÑко ÑÑо не пÑоÑÑое Ð¸Ð¼Ñ ÑаблиÑÑ. ÐапÑимеÑ, еÑли myfunc() â ÑÑнкÑиÑ, возвÑаÑаÑÑÐ°Ñ ÑоÑÑавной Ñип Ñо ÑÑолбÑами a, b и c, Ñо ÑÑи два запÑоÑа вÑдадÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñй ÑезÑлÑÑаÑ:
SELECT (myfunc(x)).* FROM some_table; SELECT (myfunc(x)).a, (myfunc(x)).b, (myfunc(x)).c FROM some_table;
ÐодÑказка
Postgres Pro оÑÑÑеÑÑвлÑÐµÑ ÑазвÑÑÑÑвание ÑÑолбÑов ÑакÑиÑеÑки пеÑÐµÐ²Ð¾Ð´Ñ Ð¿ÐµÑвÑÑ ÑоÑÐ¼Ñ Ð²Ð¾ вÑоÑÑÑ. Таким обÑазом, в данном пÑимеÑе myfunc() бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ ÑÑи Ñаза Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки и Ñ Ð¾Ð´Ð½Ð¸Ð¼, и Ñ Ð´ÑÑгим ÑинÑакÑиÑом. ÐÑли ÑÑо доÑогоÑÑоÑÑÐ°Ñ ÑÑнкÑиÑ, и Ð²Ñ Ñ
оÑиÑе избежаÑÑ Ð»Ð¸ÑниÑ
вÑзовов, можно иÑполÑзоваÑÑ Ñакой запÑоÑ:
SELECT m.* FROM some_table, LATERAL myfunc(x) AS m;
РазмеÑение вÑзова ÑÑнкÑии в ÑлеменÑе FROM LATERAL гаÑанÑиÑÑеÑ, ÑÑо она бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð´Ð»Ñ ÑÑÑоки не более одного Ñаза. ÐонÑÑÑÑкÑÐ¸Ñ m.* Ñак же ÑазвоÑаÑиваеÑÑÑ Ð² m.a, m.b, m.c, но ÑепеÑÑ ÑÑи пеÑеменнÑе пÑоÑÑо ÑÑÑлаÑÑÑÑ Ð½Ð° вÑÑ
однÑе знаÑÐµÐ½Ð¸Ñ FROM. (ÐлÑÑевое Ñлово LATERAL здеÑÑ ÑвлÑеÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑм, но Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð»Ð¸ его, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´ÑеÑкнÑÑÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ x из some_table.)
ÐапиÑÑ ÑоÑÑавное_знаÑение.* пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑÐ°ÐºÐ¾Ð¼Ñ ÑазвÑÑÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑолбÑов, когда она ÑигÑÑиÑÑÐµÑ Ð½Ð° веÑÑ
нем ÑÑовне вÑÑ
одного ÑпиÑка SELECT, в ÑпиÑке RETURNING команд INSERT/UPDATE/DELETE, в пÑедложении VALUES или в конÑÑÑÑкÑоÑе ÑÑÑоки. Ðо вÑеÑ
дÑÑгиÑ
конÑекÑÑаÑ
(вклÑÑÐ°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе в Ð¾Ð´Ð½Ñ Ð¸Ð· ÑÑиÑ
конÑÑÑÑкÑий), добавление .* к ÑоÑÑÐ°Ð²Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð½Ðµ менÑÐµÑ ÑÑо знаÑение, Ñак как ÑÑо воÑпÑинимаеÑÑÑ ÐºÐ°Ðº «вÑе ÑÑолбÑÑ» и поÑÑÐ¾Ð¼Ñ Ð²ÑдаÑÑÑÑ Ñо же ÑоÑÑавное знаÑение. ÐапÑимеÑ, еÑли ÑÑнкÑÐ¸Ñ somefunc() пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве аÑгÑменÑа ÑоÑÑавное знаÑение, ÑÑи запÑоÑÑ ÑавноÑилÑнÑ:
SELECT somefunc(c.*) FROM inventory_item c; SELECT somefunc(c) FROM inventory_item c;
РобоиÑ
ÑлÑÑаÑÑ
ÑекÑÑÐ°Ñ ÑÑÑока ÑаблиÑÑ inventory_item пеÑедаÑÑÑÑ ÑÑнкÑии как один аÑгÑÐ¼ÐµÐ½Ñ Ñ ÑоÑÑавнÑм знаÑением. Ð Ñ
оÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ðµ .* в ÑÑиÑ
ÑлÑÑаÑÑ
не игÑÐ°ÐµÑ Ñоли, иÑполÑзоваÑÑ ÐµÐ³Ð¾ ÑÑиÑаеÑÑÑ Ñ
оÑоÑим ÑÑилем, Ñак как ÑÑо ÑÑно ÑказÑÐ²Ð°ÐµÑ Ð½Ð° иÑполÑзование ÑоÑÑавного знаÑениÑ. Ð ÑаÑÑноÑÑи анализаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа воÑпÑÐ¸Ð¼ÐµÑ c в запиÑи c.* как ÑÑÑÐ»ÐºÑ Ð½Ð° Ð¸Ð¼Ñ Ð¸Ð»Ð¸ пÑевдоним ÑаблиÑÑ, а не Ð¸Ð¼Ñ ÑÑолбÑа, ÑÑо избавлÑÐµÑ Ð¾Ñ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑноÑÑи; Ñогда как без .* неÑÑно, ознаÑÐ°ÐµÑ Ð»Ð¸ c Ð¸Ð¼Ñ ÑаблиÑÑ Ð¸Ð»Ð¸ Ð¸Ð¼Ñ ÑÑолбÑа, и на Ñамом деле пÑи налиÑии ÑÑолбÑа Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ c бÑÐ´ÐµÑ Ð²ÑбÑано вÑоÑое пÑоÑÑение.
ÐÑÑ ÐºÐ¾Ð½ÑепÑÐ¸Ñ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑиÑÑÐµÑ Ð¸ ÑледÑÑÑий пÑимеÑ, вÑе запÑоÑÑ Ð² коÑоÑом дейÑÑвÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾:
SELECT * FROM inventory_item c ORDER BY c; SELECT * FROM inventory_item c ORDER BY c.*; SELECT * FROM inventory_item c ORDER BY ROW(c.*);
ÐÑе ÑÑи пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ORDER BY обÑаÑаÑÑÑÑ Ðº ÑоÑÑÐ°Ð²Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑÑÑоки, вÑледÑÑвие Ñего ÑÑÑоки ÑоÑÑиÑÑÑÑÑÑ Ð¿Ð¾ пÑавилам, опиÑаннÑм в ÐодÑазделе 9.24.6. Ðднако еÑли в inventory_item ÑодеÑжиÑÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ c, пеÑвÑй запÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ Ð´ÑÑгиÑ
, Ñак как в нÑм вÑполниÑÑÑ ÑоÑÑиÑовка ÑолÑко по Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ. С показаннÑми вÑÑе именами ÑÑолбÑов пÑедÑдÑÑим запÑоÑам Ñакже ÑавнознаÑÐ½Ñ ÑледÑÑÑие:
SELECT * FROM inventory_item c ORDER BY ROW(c.name, c.supplier_id, c.price); SELECT * FROM inventory_item c ORDER BY (c.name, c.supplier_id, c.price);
(РпоÑледнем ÑлÑÑае иÑполÑзÑеÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ ÑÑÑоки, в коÑоÑом опÑÑено клÑÑевое Ñлово ROW.)
ÐÑÑÐ³Ð°Ñ Ð¾ÑобенноÑÑÑ ÑинÑакÑиÑа, ÑвÑÐ·Ð°Ð½Ð½Ð°Ñ Ñ ÑоÑÑавнÑми знаÑениÑми, ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÑÑнкÑионалÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñ ÑоÑÑавного знаÑениÑ. ÐÑо легко можно обÑÑÑниÑÑ Ñем, ÑÑо запиÑи и поле(ÑаблиÑа) взаимозаменÑемÑ. ÐапÑимеÑ, ÑледÑÑÑие запÑоÑÑ ÑавнознаÑнÑ: ÑаблиÑа.поле
SELECT c.name FROM inventory_item c WHERE c.price > 1000; SELECT name(c) FROM inventory_item c WHERE price(c) > 1000;
Ðолее Ñого, еÑли Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑÑнкÑиÑ, пÑинимаÑÑÐ°Ñ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ ÑоÑÑавного Ñипа, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑзваÑÑ ÐµÑ Ð² лÑбой запиÑи. ÐÑе ÑÑи запÑоÑÑ ÑавноÑилÑнÑ:
SELECT somefunc(c) FROM inventory_item c; SELECT somefunc(c.*) FROM inventory_item c; SELECT c.somefunc FROM inventory_item c;
ÐÑа ÑавнознаÑноÑÑÑ Ð·Ð°Ð¿Ð¸Ñи Ñ Ð¿Ð¾Ð»ÐµÐ¼ и ÑÑнкÑионалÑной запиÑи позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ñ ÑоÑÑавнÑми Ñипами ÑÑнкÑии, ÑеализÑÑÑие «вÑÑиÑлÑемÑе полÑ». ÐÑи ÑÑом пÑиложениÑ, иÑполÑзÑÑÑÐµÐ¼Ñ Ð¿Ð¾Ñледний из пÑедÑдÑÑиÑ
запÑоÑов, не нÑжно знаÑÑ, ÑÑо ÑакÑиÑеÑки somefunc â не наÑÑоÑÑий ÑÑÐ¾Ð»Ð±ÐµÑ ÑаблиÑÑ.
ÐодÑказка
УÑиÑÑÐ²Ð°Ñ Ñакое поведение, бÑÐ´ÐµÑ Ð½ÐµÑазÑмно даваÑÑ ÑÑнкÑии, пÑинимаÑÑей один аÑгÑÐ¼ÐµÐ½Ñ ÑоÑÑавного Ñипа, Ñо же имÑ, ÑÑо и Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð· полей данного ÑоÑÑавного Ñипа. Ð ÑлÑÑае неоднознаÑноÑÑи пÑоÑÑение имени Ð¿Ð¾Ð»Ñ Ð±ÑÐ´ÐµÑ Ð²ÑбÑано пÑи иÑполÑзовании ÑинÑакÑиÑа обÑаÑÐµÐ½Ð¸Ñ Ðº полÑ, а пÑоÑÑение имени ÑÑнкÑии â еÑли иÑполÑзÑеÑÑÑ ÑинÑакÑÐ¸Ñ Ð²Ñзова ÑÑнкÑии. Ðднако в PostgreSQL до веÑÑии 11 вÑегда вÑбиÑалоÑÑ Ð¿ÑоÑÑение имени полÑ, еÑли ÑолÑко ÑинÑакÑÐ¸Ñ Ð²Ñзова не подÑалкивал к пÑоÑÑÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ ÑÑнкÑии. ЧÑÐ¾Ð±Ñ Ð¿ÑинÑдиÑелÑно вÑбÑаÑÑ Ð¿ÑоÑÑение имени ÑÑнкÑии, в пÑедÑдÑÑиÑ
веÑÑиÑÑ
надо бÑло дополниÑÑ ÑÑо Ð¸Ð¼Ñ ÑÑ
емой, Ñо еÑÑÑ Ð½Ð°Ð¿Ð¸ÑаÑÑ .ÑÑ
ема.ÑÑнкÑиÑ(ÑоÑÑавное_знаÑение)
8.16.6. СинÑакÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼ÑÑ Ð¸ вÑводимÑÑ Ð·Ð½Ð°Ñений ÑоÑÑавного Ñипа
ÐнеÑнее ÑекÑÑовое пÑедÑÑавление ÑоÑÑавного знаÑÐµÐ½Ð¸Ñ ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· запиÑи ÑлеменÑов, инÑеÑпÑеÑиÑÑемÑÑ
по пÑавилам ввода-вÑвода Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑиÑ
Ñипов полей, и оÑоÑÐ¼Ð»ÐµÐ½Ð¸Ñ ÑÑÑÑкÑÑÑÑ ÑоÑÑавного Ñипа. ÐÑоÑмление ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· кÑÑглÑÑ
Ñкобок (( и )) окÑÑжаÑÑиÑ
вÑÑ Ð·Ð½Ð°Ñение, и запÑÑÑÑ
(,) Ð¼ÐµÐ¶Ð´Ñ ÐµÐ³Ð¾ ÑлеменÑами. ÐÑобелÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð²Ð½Ðµ Ñкобок игноÑиÑÑÑÑÑÑ, но внÑÑÑи они ÑÑиÑаÑÑÑÑ ÑаÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑего ÑлеменÑа и могÑÑ ÑÑиÑÑваÑÑÑÑ Ð¸Ð»Ð¸ не ÑÑиÑÑваÑÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ð¿Ñавил пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼ÑÑ
даннÑÑ
Ð´Ð»Ñ Ñипа ÑÑого ÑлеменÑа. ÐапÑимеÑ, в запиÑи:
'( 42)'
пÑÐ¾Ð±ÐµÐ»Ñ Ð±ÑдÑÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑÑÑ, еÑли ÑооÑвеÑÑÑвÑÑÑее поле Ð¸Ð¼ÐµÐµÑ ÑелоÑиÑленнÑй Ñип, но не ÑекÑÑовÑй.
Ðак бÑло показано Ñанее, запиÑÑÐ²Ð°Ñ ÑоÑÑавное знаÑение, лÑбой его ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶Ð½Ð¾ заклÑÑиÑÑ Ð² кавÑÑки. ÐÑо нÑжно делаÑÑ, еÑли пÑи ÑазбоÑе ÑÑого знаÑÐµÐ½Ð¸Ñ Ð±ÐµÐ· кавÑÑек возможна неоднознаÑноÑÑÑ. ÐапÑимеÑ, в кавÑÑки нÑжно заклÑÑаÑÑ ÑлеменÑÑ, ÑодеÑжаÑие Ñкобки, кавÑÑки, запÑÑÑÑ Ð¸Ð»Ð¸ обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ. ЧÑÐ¾Ð±Ñ Ð²ÐºÐ»ÑÑиÑÑ Ð² поле ÑоÑÑавного знаÑениÑ, заклÑÑÑнное в кавÑÑки, Ñакие ÑимволÑ, как кавÑÑки или обÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа, пеÑед ними нÑжно добавиÑÑ Ð¾Ð±ÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ. (ÐÑоме Ñого, пÑодÑблиÑованнÑе кавÑÑки в знаÑении полÑ, заклÑÑÑнного в кавÑÑки, воÑпÑинимаÑÑÑÑ ÐºÐ°Ðº одинаÑнÑе, подобно апоÑÑÑоÑам в ÑÑÑÐ¾ÐºÐ°Ñ SQL.) С дÑÑгой ÑÑоÑонÑ, можно обойÑиÑÑ Ð±ÐµÐ· кавÑÑек, заÑиÑив вÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð² даннÑÑ , коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð²Ð¾ÑпÑинÑÑÑ ÐºÐ°Ðº ÑаÑÑÑ ÑинÑакÑиÑа ÑоÑÑавного знаÑениÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑпеÑпоÑледоваÑелÑноÑÑей.
ÐнаÑение NULL в ÑÑой запиÑи пÑедÑÑавлÑеÑÑÑ Ð¿ÑÑÑÑм меÑÑом (когда Ð¼ÐµÐ¶Ð´Ñ Ð·Ð°Ð¿ÑÑÑми или Ñкобками Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
Ñимволов). ЧÑÐ¾Ð±Ñ Ð²Ð²ÐµÑÑи именно пÑÑÑÑÑ ÑÑÑокÑ, а не NULL, нÑжно напиÑаÑÑ "".
ФÑнкÑÐ¸Ñ Ð²Ñвода ÑоÑÑавного знаÑÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»ÑÑÐ°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ в кавÑÑки, еÑли они пÑедÑÑавлÑÑÑ Ñобой пÑÑÑÑе ÑÑÑоки, либо ÑодеÑÐ¶Ð°Ñ Ñкобки, запÑÑÑе, кавÑÑки или обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ, либо ÑоÑÑоÑÑ Ð¸Ð· Ð¾Ð´Ð½Ð¸Ñ Ð¿Ñобелов. (РпоÑледнем ÑлÑÑае можно обойÑиÑÑ Ð±ÐµÐ· кавÑÑек, но они добавлÑÑÑÑÑ Ð´Ð»Ñ ÑдобоÑиÑаемоÑÑи.) ÐавÑÑки и обÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа, заклÑÑÑннÑе в знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹, пÑи вÑводе дÑблиÑÑÑÑÑÑ.
ÐÑимеÑание
ÐомниÑе, ÑÑо напиÑÐ°Ð½Ð½Ð°Ñ SQL-команда пÑежде вÑего инÑеÑпÑеÑиÑÑеÑÑÑ ÐºÐ°Ðº ÑекÑÑÐ¾Ð²Ð°Ñ ÑÑÑока, а заÑем как ÑоÑÑавное знаÑение. ÐÑледÑÑвие ÑÑого ÑиÑло Ñимволов обÑаÑной коÑой ÑеÑÑÑ ÑдваиваеÑÑÑ (еÑли иÑполÑзÑÑÑÑÑ ÑпеÑпоÑледоваÑелÑноÑÑи). ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ Ð²Ð²ÐµÑÑи в поле ÑоÑÑавного ÑÑолбÑа знаÑение Ñипа text Ñ Ð¾Ð±ÑаÑной коÑой ÑеÑÑой и кавÑÑками, ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð½Ñжно бÑÐ´ÐµÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ Ñак:
INSERT ... VALUES ('("\"\\")'); СнаÑала обÑабоÑÑик ÑпеÑпоÑледоваÑелÑноÑÑей ÑдалÑÐµÑ Ð¾Ð´Ð¸Ð½ ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¾Ð±ÑаÑной коÑой ÑеÑÑÑ, Ñак ÑÑо анализаÑÐ¾Ñ ÑоÑÑавного знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð½Ð° вÑ
од ("\"\\"). Ð ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, он пеÑедаÑÑ ÑÑÑ ÑÑÑÐ¾ÐºÑ Ð¿ÑоÑедÑÑе ввода знаÑÐµÐ½Ð¸Ñ Ñипа text, где она пÑеобÑазÑÑÑÑÑ Ð² "\. (ÐÑли Ð±Ñ Ð¼Ñ ÑабоÑали Ñ Ñипом даннÑÑ
, пÑоÑедÑÑа ввода коÑоÑого Ñакже инÑеÑпÑеÑиÑÑÐµÑ Ð¾Ð±ÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ Ð¾ÑобÑм обÑазом, напÑÐ¸Ð¼ÐµÑ bytea, нам могло Ð±Ñ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸ÑÑÑÑ Ñже воÑÐµÐ¼Ñ ÑакиÑ
Ñимволов, ÑÑÐ¾Ð±Ñ ÑоÑ
ÑаниÑÑ ÑÑÐ¾Ñ Ñимвол в поле ÑоÑÑавного знаÑениÑ.) Ðо избежание Ñакого дÑблиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑпеÑÑимволов ÑÑÑоки можно заклÑÑаÑÑ Ð² доллаÑÑ (Ñм. ÐодÑаздел 4.1.2.4).
ÐодÑказка
ÐапиÑÑваÑÑ ÑоÑÑавнÑе знаÑÐµÐ½Ð¸Ñ Ð² командаÑ
SQL ÑаÑÑо бÑÐ²Ð°ÐµÑ Ñдобнее Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа ROW. Ð ROW оÑделÑнÑе знаÑÐµÐ½Ð¸Ñ ÑлеменÑов запиÑÑваÑÑÑÑ Ñак же, как еÑли Ð±Ñ Ð¾Ð½Ð¸ не бÑли Ñленами ÑоÑÑавного вÑÑажениÑ.