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

PostgreSQL

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

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

02.12.2016, 19:12. Просмотров 193. Ответов 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;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2016, 19:12     При возвращении пустого результата функцией записать кортеж в таблицу
Посмотрите здесь:

Подсчет суммы пустого столбца таблицы - PostgreSQL
Есть два запроса (БД PostgreSQL): NpgsqlCommand command6 = new NpgsqlCommand(&quot;Select sum(kollekc), sum(kolgz),...

Неправильный вывод результата - PostgreSQL
Добрый день Вопрос состоит в том, что я делаю неправильно или как отобразить следующее: дан запрос: Вывести ФИО и телефон...

Функцией добавить колонку в представление - PostgreSQL
Здравствуйте, очень нужна помощь, пожалуйста помогите:gcray: есть представление и есть функция, нужно с помощю этой функции добавить...

Поиск в xml и вывод результата! - PostgreSQL
Люди добрые,можете помочь?! Проблема заключается в следующем,есть БД Postgresql с кодировкой win-1251 (другая кодировка не выставляется)...

Как ограничить доступ юзера к таблице только функцией (хранимкой)? - PostgreSQL
Есть функции на PL/pgSQL. Как заставить юзера делать запрос через нее, а не напрямую к таблицам. Попытка ограничить юзеру доступ к...

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

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

Конструктор копии при возвращении объекта - 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; ...

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

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


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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