Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Действительность переменной типа RECORD в функции / 24 сообщений из 24, страница 1 из 1
10.09.2008, 19:42
    #35532849
SergeyVN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
Хотелось бы прояснить следующую ситуацию. Имеем функцию:

CREATE OR REPLACE FUNCTION func(i1 integer, ...) RETURNS ... AS $$
DECLARE
Rcd RECORD;
BEGIN

IF i1 IS NOT NULL
THEN
SELECT * FROM table1 WHERE table1.id = i1 LIMIT 1 INTO Rcd;
-- > После запроса Rcd не равен NULL
END IF;

IF Rcd IS NOT NULL
-- > А здесь Rcd после выхода из предыдущего блока IF_END_ IF вдруг оказывается равным NULL !!!
THEN
-- куча операторов;
END IF;
...
END;
$$ language plpgsql;

Создается впечатление, что объявленная переменная типа RECORD действительна только в рамках блока IF_END_IF, где она создается, а далее очищается (насколько я понимаю, очищается и lookup cash с результатами выборки по запросу).

И что мне делать с кучей операторов после IF, вставлять их после каждой выборки в блоке IF (а этих блоков у меня шесть штук)???
...
Рейтинг: 0 / 0
10.09.2008, 21:25
    #35532932
st_serg_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
вы чтото не договариваете...
Код: plaintext
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.
goodwin@gwnb ~ $ cat test.sql 
drop table tab1;
create table tab1(f1 int, f2 int);
insert into tab1 values( 1 ,  2 );
create or replace function f1(p1 int) returns int
as $$
declare
    r record;
begin
    if p1 is not null then
        select * into r from tab1;
        if r is not null then
            raise notice 'notice1: r is not null';
        end if;
    end if;

    if r is not null then
        raise notice 'notice2: r is not null';
    else
        raise notice 'notice2: r is null';
    end if;
    return  1 ;
end;
$$ language plpgsql;
select * from tab1;
select f1( 1 );
select f1(null::int);
select version();

goodwin@gwnb ~ $ psql < test.sql 
DROP TABLE
CREATE TABLE
INSERT  0   1 
CREATE FUNCTION
 f1 | f2 
----+----
   1  |   2 
( 1  запись)

NOTICE:  notice1: r is not null
NOTICE:  notice2: r is not null
 f1 
----
   1 
( 1  запись)

ERROR:  record "r" is not assigned yet
ПОДРОБНО:  The tuple structure of a not-yet-assigned record is indeterminate.
КОНТЕКСТ:  PL/pgSQL function "f1" line  11  at IF
                                                   version                                                    
--------------------------------------------------------------------------------------------------------------
 PostgreSQL  8 . 3 . 3  on i686-pc-linux-gnu, compiled by GCC i686-pc-linux-gnu-gcc (GCC)  4 . 1 . 2  (Gentoo  4 . 1 . 2  p1. 1 )
( 1  запись)
...
Рейтинг: 0 / 0
10.09.2008, 21:54
    #35532949
st_serg_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
а что бы не городить блоки, на вашем месте я бы переписал функцию таким образом:
Код: plaintext
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.
create or replace function f2(p1 int) returns int
as $$
declare
    r record;
begin
    if p1 is not null then
        select * into r from tab1 where f1 = p1;
        if found then
            raise notice 'working with r values';
        else
            raise notice 'no data found';
        end if;
    end if;
    return  1 ;
end;
$$ language plpgsql;

postgres=# select f2( 1 );
NOTICE:  working with r values
 f2 
----
   1 
( 1  запись)

postgres=# select f2( 2 );
NOTICE:  no data found
 f2 
----
   1 
( 1  запись)
...
Рейтинг: 0 / 0
10.09.2008, 23:07
    #35532995
DAISER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
"INTO Rcd" дожен идти сразу после "SELECT *".
...
Рейтинг: 0 / 0
10.09.2008, 23:51
    #35533029
SergeyVN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
На первый ответ.
Спасибо, попробовал вашу конструкцию.
Выглядит так

CREATE OR REPLACE FUNCTION get_cotactinfo(idfirm integer, idperson integer, isfull boolean) RETURNS varchar AS $$
DECLARE
Rcd RECORD;
ret varchar(512);
BEGIN
IF idfirm IS NOT NULL
THEN
IF idperson IS NOT NULL
THEN
SELECT DISTINCT * INTO Rcd FROM contacts WHERE contacts.eid_firm = idfirm AND contacts.eid_person = idperson LIMIT 1;
IF Rcd IS NULL
THEN
-- проверка
ret := 'RCD is NULL';
SELECT DISTINCT * INTO Rcd FROM contacts WHERE contacts.eid_person = idperson LIMIT 1;
ELSE
-- проверка
ret := 'RCD is not NULL';
END IF;
ELSE
SELECT DISTINCT * INTO Rcd FROM contacts WHERE contacts.eid_firm = idfirm LIMIT 1;
END IF;
ELSE
IF idperson IS NOT NULL
THEN
SELECT DISTINCT * INTO Rcd FROM contacts WHERE contacts.eid_person = idperson LIMIT 1;
END IF;
END IF;
IF Rcd IS NOT NULL
THEN
-- проверка
ret := ret || '-RCD is not NULL';
ELSE
-- проверка
ret := ret || '-Rcd is NULL';
END IF;
return ret;
END;
$$ language plpgsql;

Итог: RCD is not NULL-Rcd is NULL , т.е. конструкция SELECT DISTINCT * INTO Rcd работает также, как и в первом случае, вернее не работает, по крайней мере у меня.
( PostgreSQL 8.3.3 тестовая система на Windows XP)
___________________________________________________________________

Второй ответ не понял. Это не мой случай (конструкцию моей функции см. выше)
___________________________________________________________________

Третий ответ - Что по лбу, что ниже, результат тот же: RCD is not NULL-Rcd is NULL .
...
Рейтинг: 0 / 0
11.09.2008, 05:34
    #35533149
SergeyVN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
Путем уже не мозговых усилий заставил функцию работать, но в особо извращенной форме:

IF Rcd IS NULL
THEN
--> пусто !!!
ELSE
--> операторы !!!
END IF;

PostgreSQL 8.3 на Windows XP SP3
...
Рейтинг: 0 / 0
11.09.2008, 11:08
    #35533472
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
простите, но вы говорите какуюто ерунду... я думаю что проблема у вас в нагромождении ифоф, в которых вы сами разобрться не можете. Используйте вместо "ret := 'RCD is not NULL';" raise notice с разными сообщениями и увидите как именно работает ваша логика
...
Рейтинг: 0 / 0
11.09.2008, 12:57
    #35533855
SergeyVN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
Уважаемый st_serg!
Если Вы посмотрите листинг с телом функции выше, то именно такой подход для проверки я и применил. В итоге (на практике) все оказалось не так, как я предполагал, изначально задавая вопрос, а гораздо проще, но от этого мне нисколько не понятней. Обратите внимание на последний блок IF в моем втором примере. Хотите верьте, хотите не верьте, но...

IF Rcd IS NOT NULL
THEN
--> нет перехода!!!
ELSE

END IF;

не работает, а

IF Rcd IS NULL
THEN

ELSE
--> есть переход!!!
END IF;

работает! (Кроме этого блока ничего в функции не менял!)
...
Рейтинг: 0 / 0
11.09.2008, 13:12
    #35533900
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
SergeyVNЕсли Вы посмотрите листинг с телом функции выше, то именно такой подход для проверки я и применил.покажите пальцем где там raise notice ? :)

ps: Честно говоря, Ваш код невозможно прочитать. Используйте пожалуйста нормальное выравнивание вложенных блоков и тег форума src что бы Ваш пример раскрашивался цветом.
...
Рейтинг: 0 / 0
11.09.2008, 13:14
    #35533904
DAISER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
db=# create table table1(id serial primary key, value text);
NOTICE:  CREATE TABLE will create implicit sequence "table1_id_seq" for serial column "table1.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "table1_pkey" for table "table1"
CREATE TABLE
db=# insert into table1(value) values('value1');
INSERT 0 1
db=# insert into table1(value) values('value2');
INSERT 0 1
db=# insert into table1(value) values('value3');
INSERT 0 1
db=# select * from table1;
 id | value
----+--------
  1 | value1
  2 | value2
  3 | value3
(3 rows)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE OR REPLACE FUNCTION "public"."func" (i1 integer) RETURNS boolean AS
$body$
DECLARE
  Rcd record;
BEGIN
  if (i1 is not null) then
    select * from table1 where table1.id = i1 limit  1  into Rcd;
  end if;
  
  if (Rcd is not null) then
    return true;
  end if;
  return false;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
db=# select func(1);
 func
------
 t
(1 row)

db=# select func(3);
 func
------
 t
(1 row)

db=# select func(null);
ERROR:  record "rcd" is not assigned yet
DETAIL:  The tuple structure of a not-yet-assigned record is indeterminate.
CONTEXT:  PL/pgSQL function "func" line 8 at IF
db=# select func(9);
 func
------
 f
(1 row)



По-моему всё чудно работает.

P.S.:
Код: plaintext
1.
2.
3.
4.
db=# select version();
                                                  version
-----------------------------------------------------------------------------------------------------------
 PostgreSQL 8.3.3 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20061115 (prerelease) (SUSE Linux)
(1 row)
...
Рейтинг: 0 / 0
11.09.2008, 13:56
    #35534059
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
SergeyVNНа первый ответ.
Спасибо, попробовал вашу конструкцию.
Выглядит так
Код: plaintext
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.
CREATE OR REPLACE FUNCTION get_cotactinfo(idfirm integer, idperson integer, isfull boolean) RETURNS varchar AS $$
DECLARE
  Rcd RECORD;
  ret varchar( 512 );
BEGIN
IF idfirm IS NOT NULL
THEN
  IF idperson IS NOT NULL
  THEN
    SELECT DISTINCT *  INTO Rcd FROM contacts WHERE contacts.eid_firm = idfirm AND contacts.eid_person = idperson LIMIT  1 ;
    IF Rcd IS NULL
    THEN
-- проверка    
      ret := 'RCD is NULL';
      SELECT DISTINCT *  INTO Rcd FROM contacts WHERE contacts.eid_person = idperson LIMIT  1 ;
    ELSE
-- проверка    
      ret := 'RCD is not NULL';
    END IF;
  ELSE
    SELECT DISTINCT *  INTO Rcd FROM contacts WHERE contacts.eid_firm = idfirm LIMIT  1 ;
  END IF;
ELSE
  IF idperson IS NOT NULL
  THEN
    SELECT DISTINCT *  INTO Rcd FROM contacts WHERE contacts.eid_person = idperson LIMIT  1 ;
  END IF;
END IF;
IF Rcd IS NOT NULL
THEN
-- проверка    
  ret := ret || '-RCD is not NULL';
ELSE
-- проверка    
  ret := ret || '-Rcd is NULL';
END IF;
return ret;
END;
$$ language plpgsql;
Итог: RCD is not NULL-Rcd is NULL , т.е. конструкция SELECT DISTINCT * INTO Rcd работает также, как и в первом случае, вернее не работает, по крайней мере у меня.
( PostgreSQL 8.3.3 тестовая система на Windows XP)
___________________________________________________________________

Второй ответ не понял. Это не мой случай (конструкцию моей функции см. выше)
___________________________________________________________________

Третий ответ - Что по лбу, что ниже, результат тот же: RCD is not NULL-Rcd is NULL .
таки странно. какая версия ПГ ?
(в одном из старых пг был баг на проверку IS DISTICT FROM для записей/переменных внутри plpgsql ф-й.


а в чистом скл проверьте вот это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select f IS NULL AS "f IS NULL"
 , f IS NOT NULL AS "f IS NOT NULL"
 , f1 IS NULL AS "f1 IS NULL"
 , f1 IS NOT NULL AS "f1 IS NOT NULL"
from 
(SELECT NULL::int4 as a,NULL::int4) as f
 LEFT JOIN 
(SELECT  1  as a, 2  WHERE FALSE) as f1
USING (a)
...
Рейтинг: 0 / 0
11.09.2008, 14:11
    #35534111
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
для переменной типа RECORD условия IS NULL и IS NOT NULL не являются отрицаниями друг друга.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
nalbat=> select (true,null)::record is null;
 ?column?
----------
 f
( 1  row)

nalbat=> select (true,null)::record is not null;
 ?column?
----------
 f
( 1  row)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or replace function f1() returns void language 'plpgsql' as $$

        declare
                i1 record;
        begin
                select true, null into i1;

                if i1 is null then
                        raise notice 'i1 is null';
                elsif i1 is not null then
                        raise notice 'i1 is not null';
                else
                        raise notice 'else';
                end if;
        end;
$$;

nalbat=> select f1();
NOTICE:  else

можеь быть дело в этом?
...
Рейтинг: 0 / 0
11.09.2008, 14:19
    #35534138
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
LeXa NalBatдля переменной типа RECORD условия IS NULL и IS NOT NULL не являются отрицаниями друг друга.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
nalbat=> select (true,null)::record is null;
 ?column?
----------
 f
( 1  row)

nalbat=> select (true,null)::record is not null;
 ?column?
----------
 f
( 1  row)
версия ПЖ?

у меня
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select (true,null)::record is not null,  (true,null)::record is  null;
--
t;f
-----------

select version()
--
"PostgreSQL 8.1.2 on i386-unknown-freebsd5.4,..."
...
Рейтинг: 0 / 0
11.09.2008, 14:45
    #35534226
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
это поменялось то ли в 8.2, то ли в 8.3 (незнаю как точно перевести "exhibited by PostgreSQL versions prior to 8.2" :) )

http://www.postgresql.org/docs/current/interactive/functions-comparison.html

автор
expression IS NULL
expression IS NOT NULL

[skip]

Note : If the expression is row-valued, then IS NULL is true when the row expression itself is null or when all the row's fields are null, while IS NOT NULL is true when the row expression itself is non-null and all the row's fields are non-null. This definition conforms to the SQL standard, and is a change from the inconsistent behavior exhibited by PostgreSQL versions prior to 8.2.

для типа row/record:
is null = true, если само выражение null или все поля null
is not null = true, если само выражение не null и все поля не null

такое поведение соответствует стандарту SQL


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
11.09.2008, 14:52
    #35534251
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
assaверсия ПЖ?PostgreSQL 8.3.0 on x86_64-unknown-linux-gnu,..
...
Рейтинг: 0 / 0
11.09.2008, 14:56
    #35534272
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
LeXa NalBat assaверсия ПЖ?PostgreSQL 8.3.0 on x86_64-unknown-linux-gnu,..Ёш уже разъяснил, что начиная с 8.2...



т.ч. автору надо попросту проверять FOUND после селектов.
...
Рейтинг: 0 / 0
11.09.2008, 15:02
    #35534303
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
assa Ёш уже разъяснил, что начиная с 8.2...
ЗЫ : для 8.1 NULL только если запись отсуствует .
(NULL,NULL)::RECORD - была NOT NULL

т.е.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select f IS NULL AS "f IS NULL"
 , f IS NOT NULL AS "f IS NOT NULL"
 , f1 IS NULL AS "f1 IS NULL"
 , f1 IS NOT NULL AS "f1 IS NOT NULL"
from 
(SELECT NULL::int4 as a,NULL::int4) as f
 LEFT JOIN 
(SELECT  1  as a, 2  WHERE FALSE) as f1
USING (a)
--давало:
f;t;t;f
...
Рейтинг: 0 / 0
11.09.2008, 15:08
    #35534327
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
автору надо проверять Rcd в обоих местах одинаковым способом, или оба раза Rcd IS NULL, или оба раза Rcd IS NOT NULL, или иначе, в зависимости от постановки задачи

SergeyVN
Код: plaintext
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.
CREATE OR REPLACE FUNCTION get_cotactinfo(idfirm integer, idperson integer, isfull boolean) RETURNS varchar AS $$
DECLARE
  Rcd RECORD;
  ret varchar(512);
BEGIN
IF idfirm IS NOT NULL
THEN
  IF idperson IS NOT NULL
  THEN
    SELECT DISTINCT *  INTO Rcd FROM contacts WHERE contacts.eid_firm = idfirm AND contacts.eid_person = idperson LIMIT 1;
     IF Rcd IS NULL 
    THEN
-- проверка    
      ret := 'RCD is NULL';
      SELECT DISTINCT *  INTO Rcd FROM contacts WHERE contacts.eid_person = idperson LIMIT 1;
    ELSE
-- проверка    
      ret := 'RCD is not NULL';
    END IF;
  ELSE
    SELECT DISTINCT *  INTO Rcd FROM contacts WHERE contacts.eid_firm = idfirm LIMIT 1;
  END IF;
ELSE
  IF idperson IS NOT NULL
  THEN
    SELECT DISTINCT *  INTO Rcd FROM contacts WHERE contacts.eid_person = idperson LIMIT 1;
  END IF;
END IF;
 IF Rcd IS NOT NULL 
THEN
-- проверка    
  ret := ret || '-RCD is not NULL';
ELSE
-- проверка    
  ret := ret || '-Rcd is NULL';
END IF;
return ret;
END;
$$ language plpgsql;
...
Рейтинг: 0 / 0
11.09.2008, 15:11
    #35534344
DAISER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
А что если вместо "Rcd is not null" изпользовать "not Rcd is null"?
...
Рейтинг: 0 / 0
11.09.2008, 15:11
    #35534346
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
LeXa NalBatавтору надо проверять Rcd в обоих местах одинаковым способом, или оба раза Rcd IS NULL, или оба раза Rcd IS NOT NULL, или иначе, в зависимости от постановки задачи
автора интересует банальный FOUND, чему до 8.2 соответсnвовало (...)::RECORD IS NULL
...
Рейтинг: 0 / 0
11.09.2008, 15:19
    #35534372
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
SergeyVN
Код: plaintext
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.
CREATE OR REPLACE FUNCTION get_cotactinfo(idfirm integer, idperson integer, isfull boolean) RETURNS varchar AS $$
DECLARE
  Rcd RECORD;
  ret varchar(512);
BEGIN
IF idfirm IS NOT NULL
THEN
  IF idperson IS NOT NULL
  THEN
    SELECT DISTINCT *  INTO Rcd FROM contacts WHERE contacts.eid_firm = idfirm AND contacts.eid_person = idperson LIMIT 1;
     --IF Rcd IS NULL 
     IF NOT FAUND 

    THEN
-- проверка    
      ret := 'RCD is NULL';
      SELECT DISTINCT *  INTO Rcd FROM contacts WHERE contacts.eid_person = idperson LIMIT 1;
    ELSE
-- проверка    
      ret := 'RCD is not NULL';
    END IF;
  ELSE
    SELECT DISTINCT *  INTO Rcd FROM contacts WHERE contacts.eid_firm = idfirm LIMIT 1;
  END IF;
ELSE
  IF idperson IS NOT NULL
  THEN
    SELECT DISTINCT *  INTO Rcd FROM contacts WHERE contacts.eid_person = idperson LIMIT 1;
  END IF;
END IF;
 --IF Rcd IS NOT NULL 
 IF FOUND 

THEN
-- проверка    
  ret := ret || '-RCD is not NULL';
ELSE
-- проверка    
  ret := ret || '-Rcd is NULL';
END IF;
return ret;
END;
$$ language plpgsql;
т.е. как-то так
...
Рейтинг: 0 / 0
11.09.2008, 15:24
    #35534393
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
DAISERА что если вместо "Rcd is not null" изпользовать "not Rcd is null"?это разные условия

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
        rcd,
        rcd is null as rcd_is_null,
        rcd is not null as rcd_is_not_null,
        not rcd is null as not_rcd_is_null,
        not rcd is not null as not_rcd_is_not_null
from ( values
        (true,true),
        (true,null),
        (null,null)
) as rcd;

Код: plaintext
1.
2.
3.
4.
  rcd  | rcd_is_null | rcd_is_not_null | not_rcd_is_null | not_rcd_is_not_null
-------+-------------+-----------------+-----------------+---------------------
 (t,t) | f           | t               | t               | f
 (t,)  | f           | f               | t               | t
 (,)   | t           | f               | f               | t

assaавтора интересует банальный FOUNDможет быть так, это автору виднее, в зависимости от условий его задачи
...
Рейтинг: 0 / 0
11.09.2008, 17:01
    #35534786
DAISER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
LeXa NalBat DAISERА что если вместо "Rcd is not null" изпользовать "not Rcd is null"?это разные условия
Я это имел в виду.
...
Рейтинг: 0 / 0
11.09.2008, 17:27
    #35534871
SergeyVN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действительность переменной типа RECORD в функции
Огромное спасибо всем, особенно Ёшу. Это объясняет казалось бы нелогичное поведение оператора 'Rcd IS NOT NULL' в блоке IF.

"If the expression is row-valued, then IS NULL is true when the row expression itself is null or when all the row's fields are null, while IS NOT NULL is true when the row expression itself is non-null and all the row's fields are non-null. This definition conforms to the SQL standard, and is a change from the inconsistent behavior exhibited by PostgreSQL versions prior to 8.2."
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Действительность переменной типа RECORD в функции / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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