Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Вниз

Decode в InterBase   Найти похожие ветки 

 
ruslan_as   (2003-11-10 11:39) [0]

Досталось на мою долю перевести Oracle на InterBase. Там есть функция decode. А в InterBase что-нибудь похожее есть?


 
Danilka   (2003-11-10 11:41) [1]

ruslan_as © (10.11.03 11:39)
Вроде нету. Думаю, придется для этого писать ХП и делать селект из него.
У меня то-же ломки - трудно отвыкать от decode. :))


 
ruslan_as   (2003-11-10 12:22) [2]

>>Danilka "успокоил". Все равно спасибо! Время даром не потратил.


 
Romkin   (2003-11-10 12:23) [3]

А что делает decode?


 
Danilka   (2003-11-10 13:00) [4]

[3] Romkin © (10.11.03 12:23)
классная вещь!
пример из документации:

SELECT DECODE(rating, NULL, 1000, "C", 2000, "B", 4000, "A", 5000)
INTO credit_limit FROM accts WHERE acctno = my_acctno;

Если rating is null, то вернет 1000, если rating = "C", вернет 2000, равен "B" вернет 4000, равен "A" вернет 5000. Если добавить еще однин аргумент, то будет возвращать его, если rating не равен ни одному из приведеных значений.
Удобная штука, привыкаешь к ней быстро.


 
Vlad   (2003-11-10 13:06) [5]


> Romkin © (10.11.03 12:23) [3]

decode(a,b,c,d,e,f,g,.....,h)
если а=b, вернуть c
если а=d, вернуть e
если а=f, вернуть g
.....
иначе вернуть h


 
Danilka   (2003-11-10 13:14) [6]

[5] Vlad © (10.11.03 13:06)

SELECT nvl(decode(dummy,"Z",1,"Y",2),-1) FROM dual

вернул -1, а не 2, как должен-бы был исходя из твоего поста. :))


 
Vlad   (2003-11-10 13:45) [7]


> Danilka © (10.11.03 13:14) [6]
> [5] Vlad © (10.11.03 13:06)
>
> SELECT nvl(decode(dummy,"Z",1,"Y",2),-1) FROM dual
>
> вернул -1, а не 2, как должен-бы был исходя из твоего поста.
> :))

Не понял, причем тут это ? Я об NVL ни слова не говорил.
Вот если напишешь
SELECT decode(dummy,"Z",1,"Y",2,3) FROM dual
То вернет - 3 - чесслово :)


 
Johnmen   (2003-11-10 13:46) [8]

>Danilka © (10.11.03 13:14)

А где в его посте nvl ?
:)))


 
Danilka   (2003-11-10 13:57) [9]

[7] Vlad © (10.11.03 13:45)
[8] Johnmen © (10.11.03 13:46)

если кол-во аргументов будет четное, то в том случае, когда первый аргумент не равен ни одному из четных аргументов, вернется последний аргумент. Если ко-во аргументов - нечетное, то в случае, когда первый аргумент неравен ниодному из четных (по счету) аргументов, вернет не последний аргумент, а null.

теперь смотрим внимательно:
смотрим внимательно: [5] Vlad © (10.11.03 13:06)

Если а не равно ни b, ни d, ни f, и т.д., и кол-во аргументов будет нечетное, то вернет не h, а null.
Вот что я имел ввиду. :))


 
Danilka   (2003-11-10 14:01) [10]

а nvl я в пример засунул, т.к. как еще показать, что декоде вернул нулл? :))


 
Vlad   (2003-11-10 14:37) [11]


> Danilka © (10.11.03 13:57) [9]

Согласен, я в курсе этого :)
А теперь сравним Danilka © (10.11.03 13:00) [4] и Vlad © (10.11.03 13:06) [5] и поймем что это одно и тоже, только написано разным языком. Но придрались именно ко мне, за мою неточность, да простят меня боги если я их чем прогневил и что не привел целиком справку по ф-ции decode.


 
Danilka   (2003-11-10 14:40) [12]

[11] Vlad © (10.11.03 14:37)
да ладно. просто хотел побыть немного занудой. :))


 
Romkin   (2003-11-10 14:42) [13]

Энто вам Firebird 1.5 пользовать надо, там и CASE и COALESCE есть. По стандарту. На отклонения от стандарта SQL надеяться не надо, decode не будет :)
Вот что можно в полуторке:

SELECT
o.ID,
o.Description,
CASE
WHEN (o.Status IS NULL) THEN "new"
WHEN (o.Status = 1) THEN "confirmed"
WHEN (o.Status = 3) THEN "in production"
WHEN (o.Status = 4) THEN "ready"
WHEN (o.Status = 5) THEN "shipped"
ELSE "unknown status """ || o.Status || """"
END
FROM Orders o;

Хотя я бы все равно предпочел select SP, оно и надежнее, да и быстрее работать должно, а пользователю все равно, откуда select идет


 
Vlad   (2003-11-10 14:45) [14]


> Romkin © (10.11.03 14:42) [13]

Я бы тоже хранимку сделал для надежности, но разве в IB можно сделать ф-цию с переменным кол-вом аргументов ?


 
Romkin   (2003-11-10 14:47) [15]

При чем здесь функция? Просто вместо запроса делаешь ХП с for select, а внутри цикла - IF с нужной установкой выходного параметра, и все.


 
Vlad   (2003-11-10 14:52) [16]


> Romkin © (10.11.03 14:47) [15]

Это тогда для каждого подобного случая свою ХП писать ? Слишком жирно по-моему :)
Речь идет именно о аналоге ф-ции decode, которого судя по всему в IB нет, если не считать [13], потому как это справедливо только для FB и Ya, на сколько я помню.


 
Romkin   (2003-11-10 14:54) [17]

В частности, я бы написал

SELECT
o.ID,
o.Description,
CASE
WHEN (o.Status IS NULL) THEN "new"
WHEN (o.Status = 1) THEN "confirmed"
WHEN (o.Status = 3) THEN "in production"
WHEN (o.Status = 4) THEN "ready"
WHEN (o.Status = 5) THEN "shipped"
ELSE "unknown status """ || o.Status || """"
END
FROM Orders o;

как

create procedure LIST_ORDER_STATUS
returns (ID integer, DESCRIPTION varchar(скока там...), STATUS_NAME varchar(<чтобы влезло>))
as
declare variable status integer;
begin
for select ID, DESCRIPTION, STATUS
from ORDERS
into :ID, :DESCRIPTION, :STATUS
do begin
STATUS_NAME = "unknown status """ || o.Status || """";
if (STATUS = 1) then STATUS_NAME = "confirmed";
if (STATUS = 3) then STATUS_NAME = "in production";
if (STATUS = 4) then STATUS_NAME = "ready";
if (STATUS = 5) then STATUS_NAME = "shipped";
suspend;
end
end

И вызов, ессно,
select * from LIST_ORDER_STATUS
И все, ничего сложного


 
Romkin   (2003-11-10 14:57) [18]

Ну почему же жирно для каждого случая? У меня, например, роль всех view выполняют подобные ХП. Об отчетах я уже и не говорю, там это строго. В результате, во-первых, все работает быстро, а во-вторых, имхо, гораздо приятнее на клиенте писать простейщий запрос к ХП, а не дикий join дюжины таблиц :)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
9-89672
Ник М. Цов
2003-05-08 17:35
2003.11.27
Текстовый квест на Delphi - реально?


14-90133
Сатир
2003-11-03 14:51
2003.11.27
Помогите расшифровать


4-90169
Hamstel
2003-07-18 17:43
2003.11.27
Запуск програмы от имени другого пользователя


14-90112
cyborg
2003-11-04 11:39
2003.11.27
FreePascal горячие клавиши


14-90131
Думкин
2003-11-06 06:23
2003.11.27
С днем рождения! 6 ноября.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский