powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Простой вопрос по : CASE ... END CASE;
4 сообщений из 4, страница 1 из 1
Простой вопрос по : CASE ... END CASE;
    #38754434
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Пример из 'учебника' :
Код: plsql
1.
2.
3.
4.
5.
6.
CASE
    WHEN x BETWEEN 0 AND 10 THEN
        msg := 'value is between zero and ten';
    WHEN x BETWEEN 11 AND 20 THEN
        msg := 'value is between eleven and twenty';
END CASE;




Вот, если условий WHEN ... THEN много, и нужно в результате выполнить команду INSERT,
при условии, что хоть один WHEN ... THEN дал положительный исход.

Создаю флаг в false и в каждом из условий меняю его на true, потом проверяю,
если флаг в true -- делаю INSERT.

А есть более простая конструкция, чтобы без флага ?
...
Рейтинг: 0 / 0
Простой вопрос по : CASE ... END CASE;
    #38754495
insert into t (v)
select v from (
select case
when t between 1 and 10 then 'value is between zero and ten'
when 11 and 20 then 'value is between eleven and twenty'
end v
from t2
)
where v is not null
...
Рейтинг: 0 / 0
Простой вопрос по : CASE ... END CASE;
    #38755133
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проще некуда,
дык челу и на ёлку влезть.

Он может проверят непустотность msg-а
, но вычислительно с флагом дешевле.
а по объёму кода -- проще сбрасывать пердустановленный флаг в ELSE . (а не выставлять в каждом WHEN )
...
Рейтинг: 0 / 0
Простой вопрос по : CASE ... END CASE;
    #38756542
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проще некуда,

спасибо за ответ, но предложенную конструкцию я так и не осилил.

И, если я правильно понял :

" но вычислительно с флагом дешевле " автора qwwq, то лучше останусь на варианте с флагом, чем потеряю скорость выполнения.

Правда, " сбрасывать пердустановленный флаг в ELSE ", как вариант сократить код, я тоже не смог прикрутить к своему примеру.

Переделал на IF-THEN для примера :

Заготовка

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE sprav
(
  sprav_id bigserial NOT NULL,
  code integer NOT NULL,
  naim character varying(250),
  kateg character varying(55),
  model character varying(55),
  codeproiz character varying(55),
  proizvod character varying(55),
  lastpr timestamp with time zone NOT NULL,
  CONSTRAINT sprav_pkey PRIMARY KEY (sprav_id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE sprav
  OWNER TO postgres;

    --DELETE FROM sprav;
    INSERT INTO sprav (code, naim, kateg, model, codeproiz, proizvod, lastpr) VALUES (918, 'f1', 'f2', 'f3', 'f4', 'f5', '2014-09-18 20:09:40.534+00'); 
    INSERT INTO sprav (code, naim, kateg, model, codeproiz, proizvod, lastpr) VALUES (919, 'f1', 'f2', 'f3', 'f4', 'f5', '2014-09-18 20:09:40.534+00'); 
    INSERT INTO sprav (code, naim, kateg, model, codeproiz, proizvod, lastpr) VALUES (920, 'f1', 'f2', 'f3', 'f4', 'f5', '2014-09-18 20:09:40.534+00'); 
    INSERT INTO sprav (code, naim, kateg, model, codeproiz, proizvod, lastpr) VALUES (921, 'f1', 'f2', 'f3', 'f4', 'f5', '2014-09-18 20:09:40.534+00'); 




Код

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
CREATE OR REPLACE FUNCTION proba()
  RETURNS text AS
$BODY$
DECLARE 
rp1 varchar;
rp2 varchar;
rp3 varchar;
rp4 varchar;
rp5 varchar;
upd varchar;
upd1 varchar; 
ins varchar;
ins1 varchar;
ins2 varchar;
flag boolean;
d date;
BEGIN
flag = FALSE;
ins1 = 'code,lastpr';
d = '2014-09-18 20:09:40.534+00';
ins2 = '878,' || quote_literal(d);

    IF 3 = 3 THEN   
    rp1 = 's1';
    upd1 = ',naim =' || quote_literal(rp1); 
    ins1 = ins1 || ',naim';
    ins2 = ins2 || ',' || quote_literal(rp1); 
    flag = TRUE;
    END IF;
                        IF 7 = 7 THEN   
                        rp2 = 's2';
                        upd1 = upd1 || ',kateg =' || quote_literal(rp2);
                        ins1 = ins1 || ',kateg';
                        ins2 = ins2 || ',' || quote_literal(rp2);                         
                        flag = TRUE;
                        END IF;
                                                         IF 9 = 55 THEN  
                                                         rp3 = 's3';
                                                         upd1 = upd1 || ',model =' || quote_literal(rp3);
                                                         ins1 = ins1 || ',model';
                                                         ins2 = ins2 || ',' || quote_literal(rp3);                                                                                  
                                                         flag = TRUE;
                                                         END IF;
                                                                                     IF 11 = 77 THEN  
                                                                                     rp4 = 's4';
                                                                                     upd1 = upd1 || ',codeproiz =' || quote_literal(rp4);
                                                                                     ins1 = ins1 || ',codeproiz';
                                                                                     ins2 = ins2 || ',' || quote_literal(rp4);                                                                                                                                                                       
                                                                                     flag = TRUE;
                                                                                     END IF;
                                                                                                            IF 21 = 21 THEN   
                                                                                                            rp5 = 's5';
                                                                                                            upd1 = upd1 || ',proizvod =' || quote_literal(rp5);
                                                                                                            ins1 = ins1 || ',proizvod';
                                                                                                            ins2 = ins2 || ',' || quote_literal(rp5);                                                                                                                                                                                                                                                                                   
                                                                                                            flag = TRUE;
                                                                                                            END IF;
-- Если хоть один верхний  IF--THEN  дал положительный исход, то нужно выполнить : 
IF flag = TRUE THEN
            ins = 'INSERT INTO sprav (' || ins1 || ')VALUES(' || ins2 || ');';
            execute ins;
            upd = 'UPDATE sprav SET ' || ltrim(upd1, ',') || ' WHERE code = 919;';
            execute upd;
END IF;
return 0; 																																																													
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION proba()
  OWNER TO postgres;




По выполнению кода select proba(); получаю :

Код: plsql
1.
2.
3.
4.
5.
1;918;"f1";"f2";"f3";"f4";"f5";"2014-09-18 20:09:40.534+00"
2;919;"s1";"s2";"f3";"f4";"s5";"2014-09-18 20:09:40.534+00"
3;920;"f1";"f2";"f3";"f4";"f5";"2014-09-18 20:09:40.534+00"
4;921;"f1";"f2";"f3";"f4";"f5";"2014-09-18 20:09:40.534+00"
5;878;"s1";"s2";"";"";"s5";"2014-09-18 00:00:00+00"


...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Простой вопрос по : CASE ... END CASE;
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]