powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Количество возвращаемых строк из функции
8 сообщений из 8, страница 1 из 1
Количество возвращаемых строк из функции
    #32437058
MaximZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обнаружил одну неприятную вещь. Имеется функция типа:

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

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

Проверял в перле. после вызова функции по пустой таблице, всегда клоичество возвращаемых строк 1.
...
Рейтинг: 0 / 0
Количество возвращаемых строк из функции
    #32437495
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если 1) в таблице нет строк, или 2) значения поля field1 во всех строках - NULL, то эта функция действительно возвращает одну строку со значением NULL. Может быть это и использовать как признак? (Или вам нужно различать ситуации 1 и 2?)
...
Рейтинг: 0 / 0
Количество возвращаемых строк из функции
    #32437522
MaximZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в моем случае это поен не может быть NULL. Мне надо различить если строк нет, то тогда одни действия если есть, то другие.
На саомм деле я немного разобрался. Так как это по любому результат работы функции которая возвращает значение (я имею ввиду функцию MAX), то по этому и возвращается как минимум одна строка. В данном случае (когда в таблице нат строк) видимо NULL. Но перл такие штуки не понимает, для него это просто пустая строка.
в результате если сравнивать вызвращаемый результат с пустой строкой, то и получаем некую диагностику. Если в таблице строк нет, то в перл возвращается пустая строка, если есть результат, то соответственно он и возвращается.
Хлипковато конечно, но хоть какое то решение. Уж больно не хочется городить отдельный запрос для подсчета строк. Как то глупо получается. Хотя кто знает.
...
Рейтинг: 0 / 0
Количество возвращаемых строк из функции
    #32437565
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Но перл такие штуки не понимает, для него это просто пустая строка."

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

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

Мне кажется что решение вполне нормальное.
...
Рейтинг: 0 / 0
Количество возвращаемых строк из функции
    #32437837
Sad Spirit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ваще-то вместо
Код: plaintext
1.
select max(field1) from table1;

лучше юзать
Код: plaintext
1.
SELECT field1 FROM table1 ORDER BY field1 DESC LIMIT  1 ;

два плюса:
1) будет использоваться индекс по field1, если есть;
2) не будет возвращаться записей, если таблица пустая.
...
Рейтинг: 0 / 0
Количество возвращаемых строк из функции
    #32438233
MaximZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Вроде бы в перле это не пустая строка, а undef.


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

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


Ну знаете, а зачем же тогда функции?
...
Рейтинг: 0 / 0
Количество возвращаемых строк из функции
    #32438487
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"пробовал, возвращается именно пустая строка. По крайней мере на функцию 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'
...
Рейтинг: 0 / 0
Количество возвращаемых строк из функции
    #32439045
Konrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы сделал через SELECT field1 FROM table1 ORDER BY field1 DESC LIMIT 1, и не глумился бы с проверками
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Количество возвращаемых строк из функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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