Форум: "Базы";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
ВнизЗапрос SQL с конвертацией типа переменно Найти похожие ветки
← →
galexis (2003-03-17 18:40) [0]Нужно написать примерно такой запрос: select * from Table Where SUMMA<>"" AND CAST(SUMMA AS INTEGER)>100 - Такой запрос не работает. Поле SUMMA имеет тип VARCHAR и содержит пустые значения.
Спасибо за помощь
← →
zacho (2003-03-17 18:50) [1]Варианты решения:
1. Вместо "пустых" значений используй "0". (Кстати, у тебя "пустые значения" - это NULL или "" ?)
2. Хранимая процедура.
3. UDF, которая будет возвращать "0" вместо "пустых" значений
4. В Yaffil есть IIF, вроде бы в FB тоже есть что-то подобное, пусть подскажут знатоки FB
← →
galexis (2003-03-17 19:05) [2]1. Видимо всетаки ""
4. А что делает IIF в Yaffil?
Насколько я понимаю, запросом нельзя что ли выбрать записи с пустым значением поля, а затем конвертнуть тип?
← →
zacho (2003-03-17 19:22) [3]
> galexis © (17.03.03 19:05)
> 4. А что делает IIF в Yaffil?
Функция IIF(условие,значение_если_true,значение_если_false) возвращает значение_если_true при условие=true и значение_если_false при условие=false
Т.е. в твоем случае помогло быWHERE CAST(IIF(SUMMA="","0",SUMMA) AS INTEGER)>100
> Насколько я понимаю, запросом нельзя что ли выбрать записи
> с пустым значением поля, а затем конвертнуть тип?
Че-то я глючу :-) Невнимательно посмотрел твой запрос:( Похоже, тебе поможет HAVING .
← →
galexis (2003-03-17 19:53) [4]Ошибка на незнание IIF не выдается, но выдается ошибка, что неизвестен символ "=".
А как использовать HAVING? Это же группировка
← →
Dred2k (2003-03-17 20:11) [5]> Where SUMMA<>""
О, те же самые NULL-ы ...
Или я не прав? ;)
"summa is not null" - нет?
← →
zacho (2003-03-17 20:17) [6]
> galexis © (17.03.03 19:53)
> Ошибка на незнание IIF не выдается, но выдается ошибка,
> что неизвестен символ "=".
Все-таки пусть выскажуться знатоки FB. В YA-работает
> А как использовать HAVING? Это же группировка
Да, второй раз проглючил.. :( Совсем забыл, что HAVING работает только с агрегатами. :-(
В общем, снова:
> Насколько я понимаю, запросом нельзя что ли выбрать записи
> с пустым значением поля, а затем конвертнуть тип?
Можно, используя UDF, или если в FB есть что-то аналогичное Дятловскому IIF. Еще можно с помощью хранимой процедуры.
И все-таки, кажется мне, что в FB что-то такое было. Почитай доки к FB или жди ответа знатоков FB.
← →
zacho (2003-03-17 20:26) [7]
> Dred2k © (17.03.03 20:11)
> > Where SUMMA<>""
>
> О, те же самые NULL-ы ...
> Или я не прав? ;)
Да скорее всего прав:) Но в данном случае нет разницы, NULL там или "". Так что "summa is not null" imho, не поможет ;)
← →
Виталий Панасенко (2003-03-18 08:43) [8]select * from Table Where SUMMA is not null AND CAST(SUMMA AS INTEGER)>100
А так не работает тоже ?
← →
galexis (2003-03-18 09:14) [9]>Виталий Панасенко
И так не работает.
>zacho
Работает так:
select SUMMA from Table where SUMMA<>"" AND SUMMA<>"0" GROUP BY SUMMA HAVING CAST(SUMMA AS INTEGER) >10000
Но так: 1)слишком громоздко 2) Запрос у меня по нескольким таблицам и в where должно быть еще куча разных условий 3) группировка должна идти по всем полям, которые нужно получить, а это еще более громоздкий запрос
← →
ЮЮ (2003-03-18 09:25) [10]> Where SUMMA is not null :-)
WHERE NOT ( SUMMA IS NULL)
← →
Johnmen (2003-03-18 09:31) [11]is not null = not ( is null) :)))
← →
ЮЮ (2003-03-18 09:34) [12]>Johnmen © (18.03.03 09:31)
Логически - да, а синтаксически - :-(
← →
galexis (2003-03-18 09:53) [13]WHERE NOT ( SUMMA IS NULL) - не работает! Работает так:
WHERE NOT ( SUMMA="") Но в паре с select SUMMA from Table where NOT (SUMMA="") AND CAST(SUMMA AS INTEGER)>1000
Вот и пришли к моему первому вопросу, т.к.
NOT (SUMMA="") = SUMMA<>""
← →
galexis (2003-03-18 09:56) [14]Нашел в доках к FB описание UDF - FBUDF.dll, там есть :
NVL() functions for both exact precision ("invl") and string ("snvl") parameters
These functions attempt to mimic the NVL function of Oracle, to output an actual value when
the column has a NULL value. They take two arguments, the first being the expression being
tested for NULL, the second the value to output if the first argument is NULL. NVL will return
the first argument if it"s not null and the second argument if the first one is null. If both are
null, you get null.
The pair of parameters should be compatible, either two numeric values (smallint, int, int64)
or two string values (char, varchar, cstring). The engine does not honor the parameter types
when using the technique exercised by FBUDF, so mixing a numeric and a string as arguments
will yield wrong results.
Как ее испоьзовать (задекларировать)?
← →
ЮЮ (2003-03-18 09:57) [15]>WHERE NOT ( SUMMA IS NULL) - не работает!
Что значит не работает? Ошибка синтаксиса? Или не фильтрует? Значит у теья не NULL стоит, а "".
← →
Johnmen (2003-03-18 10:01) [16]описание UDF нашел, а элементарную доку по SQL не можешь...?
← →
galexis (2003-03-18 10:30) [17]>ЮЮ ©
Не фильтрует. А я и писал выше, что у меня "" ,а не NULL. Но в процессе обсуждения решили что это одно и тоже.
>Johnmen ©
Формат DECLARE я знаю, да объявляю так:
declare external function SNVL CSTRING(100)
returns CSTRING(100)
entry_point "FBUDF_SNVL"
module_name "FBUDF"
Все проходит нормально, но когда запрос select выполняешь - пишет что функция неизвестна SNVL.
Как проверить, что внешняя функция работает?
← →
Johnmen (2003-03-18 10:52) [18]1.В объявлении соблюсти регистр для указания точки входа
2.module_name "FBUDF.dll"
3.Сама dll - в каталоге UDF
← →
Johnmen (2003-03-18 10:56) [19]>А я и писал выше, что у меня "" ,а не NULL. Но в процессе >обсуждения решили что это одно и тоже.
Абсолютно разные вещи !!!
Общий совет - стараться грамотно проектировать БД и не допускать извращений типа INTEGER храниться в (VAR)CHAR
← →
galexis (2003-03-18 11:08) [20]Так и как определить entry_point по тому что написано в описании к UDF
← →
galexis (2003-03-18 11:13) [21]Выдает такую ошибку:
Invalid request BLR at offset 72
function SNVL is not defined
module name or entrypoint could not be found
Видимо я неправильно задаю entrypoint. DLL-ка лежит там где надо
← →
galexis (2003-03-18 11:42) [22]Нашел как правильно регистрировать функцию:
declare external function snvl
varchar(100) by descriptor, varchar(100) by descriptor,
varchar(100) by descriptor returns parameter 3
entry_point "sNvl" module_name "fbudf";
Но ошибка осталась. Может с FB-сервером что делать надо? Например перезагрузить?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.011 c