Количество возвращаемых строк из функции

MaximZ
Дата: 10.03.2004 23:30:31
Обнаружил одну неприятную вещь. Имеется функция типа:

create function test1() returns int as'
select max(field1) from table1;' language 'sql';

И эта функция почему то всегда выдает одну строку. При том даже если таблица пустая.
Может это и хороше, а может и плохо. По крайней мере придется делать дополнительную проверку на количество строк в таблице. а тк было бы хорошо. нет строк, возвращает пустой ответ.

Проверял в перле. после вызова функции по пустой таблице, всегда клоичество возвращаемых строк 1.
LeXa NalBat
Дата: 11.03.2004 11:08:23
Если 1) в таблице нет строк, или 2) значения поля field1 во всех строках - NULL, то эта функция действительно возвращает одну строку со значением NULL. Может быть это и использовать как признак? (Или вам нужно различать ситуации 1 и 2?)
MaximZ
Дата: 11.03.2004 11:20:11
в моем случае это поен не может быть NULL. Мне надо различить если строк нет, то тогда одни действия если есть, то другие.
На саомм деле я немного разобрался. Так как это по любому результат работы функции которая возвращает значение (я имею ввиду функцию MAX), то по этому и возвращается как минимум одна строка. В данном случае (когда в таблице нат строк) видимо NULL. Но перл такие штуки не понимает, для него это просто пустая строка.
в результате если сравнивать вызвращаемый результат с пустой строкой, то и получаем некую диагностику. Если в таблице строк нет, то в перл возвращается пустая строка, если есть результат, то соответственно он и возвращается.
Хлипковато конечно, но хоть какое то решение. Уж больно не хочется городить отдельный запрос для подсчета строк. Как то глупо получается. Хотя кто знает.
LeXa NalBat
Дата: 11.03.2004 11:35:24
"Но перл такие штуки не понимает, для него это просто пустая строка."

Вроде бы в перле это не пустая строка, а undef.

"Хлипковато конечно, но хоть какое то решение."

Мне кажется что решение вполне нормальное.
Sad Spirit
Дата: 11.03.2004 13:11:37
ваще-то вместо

select max(field1) from table1;

лучше юзать

SELECT field1 FROM table1 ORDER BY field1 DESC LIMIT 1;

два плюса:
1) будет использоваться индекс по field1, если есть;
2) не будет возвращаться записей, если таблица пустая.
MaximZ
Дата: 11.03.2004 15:36:38
автор

Вроде бы в перле это не пустая строка, а undef.


пробовал, возвращается именно пустая строка. По крайней мере на функцию defined() говорит что все действительно дефайнед.

автор

1) будет использоваться индекс по field1, если есть;
2) не будет возвращаться записей, если таблица пустая.


Ну знаете, а зачем же тогда функции?
LeXa NalBat
Дата: 11.03.2004 16:55:56
"пробовал, возвращается именно пустая строка. По крайней мере на функцию defined() говорит что все действительно дефайнед."

Это странно, потому что у меня такой скрипт:

#!/usr/bin/perl -w

use strict;
use DBI;

my $dbh = DBI->connect( "dbi:Pg:dbname=template1", "postgres" )
|| die "cant connect";

my $sth = $dbh->prepare( "select 'foo', null, '', 'bar'" )
|| die "cant prepare";

$sth->execute()
|| die "cant execute";

my @row = $sth->fetchrow();

print map { defined($_) ? "'$_'\n" : "UNDEF\n" } @row;

$sth->finish()
|| die "cant finish";

$dbh->disconnect();

Выдает:

'foo'
UNDEF
''
'bar'
Konrad
Дата: 12.03.2004 07:41:00
Я бы сделал через SELECT field1 FROM table1 ORDER BY field1 DESC LIMIT 1, и не глумился бы с проверками