Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

PostgreSQL

Войти
Регистрация
Восстановить пароль
 
evgeny_kravchuk
1 / 1 / 0
Регистрация: 12.04.2015
Сообщений: 14
#1

При возвращении пустого результата функцией записать кортеж в таблицу - PostgreSQL

02.12.2016, 19:12. Просмотров 194. Ответов 0
Метки нет (Все метки)

Здравствуйте.
Есть функция в которой я подбираю квартиру по параметрам для клиента риелторской фирмы. Если же таких квартир не нашлось, записать его желания в таблицу.
Функция возвращает квартиры, которые подходят, но как реализовать запись в таблицу, если функция не нашла подходящих квартир.

SQL
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 
    AddOrFindDesiredFlat ("id_client" SMALLINT,
                "DCity" VARCHAR,
                "DHood" hood,
                "DStreet" VARCHAR,
                "DArea" INT,
                "DRoom" SMALLINT,
                "DFloor" SMALLINT,
                "DStatus" home_status,
                "DPrice" FLOAT) 
 
    RETURNS TABLE("id_object" INT,
            "id_owner" SMALLINT,
            "Address" address,
            "Hood" hood,
            "Type" TYPE,
            "Price" FLOAT,
            "Area" INT,
            "Room" SMALLINT,
            "Floor" SMALLINT,
            "Status" home_status)
    AS $$
    DECLARE
    "DType" TEXT;
    BEGIN
        "DType" := 'Flat';
        RETURN QUERY 
            SELECT F.*
            FROM "Flat" F
            WHERE   "DCity" = (F."Address")."City"
                AND ("DHood" = F."Hood" OR "DHood" IS NULL)
                AND ("DStreet" = (F."Address")."Street" OR "DStreet" IS NULL)
                AND ("DType" = F."Type")
                AND ((F."Area" < "DArea" * 1.5 AND F."Area" > "DArea" * 0.5) OR "DArea" IS NULL)
                AND ((F."Room" < "DRoom" + 2 AND F."Room" > "DRoom" - 2) OR "DRoom" IS NULL)
                AND ((F."Floor" < "DFloor" + 2 AND F."Floor" > "DFloor" - 2) OR "DFloor" IS NULL)
                AND ("DStatus" = F."Status" OR "DStatus" IS NULL)
                AND ((F."Price" < "DPrice" * 1.5 AND F."Price" > "DPrice" * 0.5) OR "DPrice" IS NULL);
        IF результат пустой THEN INSERT ... ...;
            END IF;
    END; 
$$ LANGUAGE plpgsql;
Добавлено через 2 часа 47 минут
Уже не не нужно.
Кому интересно, как сделал, вот код. Посчитал количество строк и потом если их 0 добавил в таблицу.
SQL
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
CREATE OR REPLACE FUNCTION 
    AddOrFindDesiredFlat ("id_client" SMALLINT,
                "DCity" VARCHAR,
                "DHood" hood,
                "DStreet" VARCHAR,
                "DArea" INT,
                "DRoom" SMALLINT,
                "DFloor" SMALLINT,
                "DStatus" home_status,
                "DPrice" FLOAT) 
 
    RETURNS TABLE("id_object" INT,
            "id_owner" SMALLINT,
            "Address" address,
            "Hood" hood,
            "Type" TYPE,
            "Price" FLOAT,
            "Area" INT,
            "Room" SMALLINT,
            "Floor" SMALLINT,
            "Status" home_status)
    AS $$
    DECLARE
    "DType" TEXT;
    "RowCount" INT;
    BEGIN
        "DType" := 'Flat';
        SELECT COUNT(F.*) INTO "RowCount"
        FROM "Flat" F
        WHERE   "DCity" = (F."Address")."City"
            AND ("DHood" = F."Hood" OR "DHood" IS NULL)
            AND ("DStreet" = (F."Address")."Street" OR "DStreet" IS NULL)
            AND ("DType" = F."Type")
            AND ((F."Area" < "DArea" * 1.5 AND F."Area" > "DArea" * 0.5) OR "DArea" IS NULL)
            AND ((F."Room" < "DRoom" + 2 AND F."Room" > "DRoom" - 2) OR "DRoom" IS NULL)
            AND ((F."Floor" < "DFloor" + 2 AND F."Floor" > "DFloor" - 2) OR "DFloor" IS NULL)
            AND ("DStatus" = F."Status" OR "DStatus" IS NULL)
            AND ((F."Price" < "DPrice" * 1.5 AND F."Price" > "DPrice" * 0.5) OR "DPrice" IS NULL);
 
        IF ("RowCount" = 0) THEN 
            INSERT INTO "DesiredFlat"("id_client","City","Hood","Street","Type","Area","Room","Floor","Status","Price") VALUES
                ("id_client","DCity","DHood","DStreet","DType","DArea","DRoom","DFloor","DStatus","DPrice");
            RETURN QUERY 
            SELECT F.*
            FROM "Flat" F
            WHERE   "DCity" = (F."Address")."City"
                AND ("DHood" = F."Hood" OR "DHood" IS NULL)
                AND ("DStreet" = (F."Address")."Street" OR "DStreet" IS NULL)
                AND ("DType" = F."Type")
                AND ((F."Area" < "DArea" * 1.5 AND F."Area" > "DArea" * 0.5) OR "DArea" IS NULL)
                AND ((F."Room" < "DRoom" + 2 AND F."Room" > "DRoom" - 2) OR "DRoom" IS NULL)
                AND ((F."Floor" < "DFloor" + 2 AND F."Floor" > "DFloor" - 2) OR "DFloor" IS NULL)
                AND ("DStatus" = F."Status" OR "DStatus" IS NULL)
                AND ((F."Price" < "DPrice" * 1.5 AND F."Price" > "DPrice" * 0.5) OR "DPrice" IS NULL);
        ELSE
            RETURN QUERY 
                SELECT F.*
                FROM "Flat" F
                WHERE   "DCity" = (F."Address")."City"
                    AND ("DHood" = F."Hood" OR "DHood" IS NULL)
                    AND ("DStreet" = (F."Address")."Street" OR "DStreet" IS NULL)
                    AND ("DType" = F."Type")
                    AND ((F."Area" < "DArea" * 1.5 AND F."Area" > "DArea" * 0.5) OR "DArea" IS NULL)
                    AND ((F."Room" < "DRoom" + 2 AND F."Room" > "DRoom" - 2) OR "DRoom" IS NULL)
                    AND ((F."Floor" < "DFloor" + 2 AND F."Floor" > "DFloor" - 2) OR "DFloor" IS NULL)
                    AND ("DStatus" = F."Status" OR "DStatus" IS NULL)
                    AND ((F."Price" < "DPrice" * 1.5 AND F."Price" > "DPrice" * 0.5) OR "DPrice" IS NULL);
        END IF;
    END; 
$$ LANGUAGE plpgsql;
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2016, 19:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При возвращении пустого результата функцией записать кортеж в таблицу (PostgreSQL):

MS Access Запись в таблицу пустого TDBLookupComboBox - Delphi БД
Есть таблица, связанная с DBLookupComboBox. Нужно код выбранного значения записать Sql-запросом в другую таблицу. DBLookupComboBox...

Передача пустого значения в таблицу Oracle - Delphi БД
на форме delphi есть Edit'ы. как правильно прописать передачу пустого edit? на три edit'а есть такая запись if edit1.text='' then ...

Ошибка при возвращении в меню из игры - ActionScript
В игре я сделал персонажа, за которым двигается камера и он постоянно в центре. Добавил кнопку возврата в меню ошибка И высвечивается...

Проблема при возвращении на просмотренные страницы - C# ASP.NET
Сайт на ASP. При хождении по ссылкам все ok, но если потом возвращаться на посещенные страницы (через кнопку Back т.е.), то некоторые...

Ошибка при возвращении ссылки из функции - C++
Когда функция возвращает ссылку, то ее можно использовать с левой стороны от знака &quot;=&quot;. Только не пойму почему не работает ...

Конструктор копии при возвращении объекта - C++
main(): #include&quot;Class_Taxi.h&quot; #include&lt;vld.h&gt; #include&lt;iostream&gt; #include&lt;locale.h&gt; #define MAX 15 using namespace std; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2016, 19:12
Привет! Вот еще темы с ответами:

-1.#IND при возвращении значения функции - C++
#include&lt;iostream&gt; using namespace std; float res=0; float number() { char c=cin.get(); if(c&gt;='0' &amp;&amp; c&lt;='9') { ...

при возвращении показывается пустая страница - jQuery
Как сделать, чтобы не пустая страница показывалась, а еще раз открывалась страница так, как просто по ней перейти. Короче чтоб все было...

Возращение функцией 2 и более результата - Delphi
Здравствуйте, вопрос, может ли эта функция из DLL вернуть в программу 2 и более результата ? (в даном примере 2) DLL Function Расчет (...

Выбор UPS включающийся при возвращении электричества - Блоки питания
Нужен ИБП без всякого софта. Единственное, что надо - чтобы после выключения электричества, полной разрядки ИБП и последующего возвращения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru