Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Числовое преобразование значения / 21 сообщений из 21, страница 1 из 1
09.09.2009, 16:03
    #36186725
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Есть таблица со строковым полем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Table1:
id     value

 1       'qqq'
 2       null
 3       '1'
 4       '2'
 5       '2009.01.01'

Необходимо извлечь записи, удовлетворяющие условию только для чиловых значений, например,
что типа
Код: plaintext
1.
select * from table1 where /*Если value - числовое, то*/ value <  2 
Аналогично только для даты.
...
Рейтинг: 0 / 0
09.09.2009, 20:30
    #36187310
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Код: plaintext
1.
2.
3.
SELECT id, value
FROM myschema.mytable
WHERE XMLEXISTS('let $null := () return if ($v castable as xs:integer and xs:integer($v) > 300) then 1
else if ($v castable as xs:date and xs:date($v) > xs:date("2009-01-01")) then 1 else ()' PASSING value AS "v")


---------------------------------------------------------
IS NULL OR NOT IS NULL
...
Рейтинг: 0 / 0
10.09.2009, 07:48
    #36187624
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Интересный способ, но при выполнении такого запроса выдается ошибка
Код: plaintext
1.
2.
Обнаружен неправильный элемент "'let $null := () return if ($v 
casta" после текста "tes WHERE XMLEXISTS(".  Список правильных элементов: 
"<table_expr>".  SQLSTATE= 42601 
...
Рейтинг: 0 / 0
10.09.2009, 08:04
    #36187634
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Может есть какая нибудь функция проверки на тип? Или самому придется ее писать?
...
Рейтинг: 0 / 0
10.09.2009, 08:53
    #36187693
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
То, что было написаны выше - для DB2 от версии 9.5 и выше. Других способов проверять тип не вижу. Можно написать функции типа STRASINT, STRASDATE, которые проверяют является ли входной параметр-строка целым или датой, если да, то возвращают его, если нет, то NULL. Тогда в условии можно использовать STRASINT(value) > 100 STRASDATE(value) >= '2009-09-09'.

---------------------------------------------------------
IS NULL OR NOT IS NULL
...
Рейтинг: 0 / 0
10.09.2009, 09:14
    #36187722
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Да, версия db2 8.1, значит придется писать свою функцию. Тогда другой вопрос, как можно обработать исключительную ситуацию преобразования типа?
...
Рейтинг: 0 / 0
10.09.2009, 17:40
    #36189485
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Rust(),

Пишите c или java функцию.

Или 9.7 ставьте.
Там можно:
Код: plaintext
1.
2.
3.
4.
5.
6.
create function int_safe(v varchar( 11 ))
returns int
begin
  declare exit handler for sqlstate '22018', sqlstate '22003'
    return cast(null as int);
  return int(v);
end@
...
Рейтинг: 0 / 0
11.09.2009, 07:42
    #36190120
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Точно, и как сам не догодался... спасибо всем.
...
Рейтинг: 0 / 0
11.09.2009, 08:09
    #36190136
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Хотя... при создании функции в центре разработки при помощи мастера предлагает выбрать тип функции : SQL, Websphere MQ, XML и OLE DB. В 8.1 версии можно создавать java функции?
...
Рейтинг: 0 / 0
11.09.2009, 15:38
    #36191445
Lkhiger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
На мой взгляд проблема ваша решается совсем просто.

Используем функцию TRANSLATE(value, '*', ' 0123456789')
которая транслирует все цифры в space, а space в '*'.

После трансляции цифровая строка должна стать пустой, а не цифровая будет не пустой.

NULL останется NULL.

Можете проверить как это работает.

авторSelect * from table1
where TRANSLATE(value, '*', ' 0123456789') = ' '

Thanks, Lenny.
...
Рейтинг: 0 / 0
11.09.2009, 16:18
    #36191568
Lkhiger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Note:
For DATE you can use:

авторSelect * from table1
where TRANSLATE(value, '*', ' .-0123456789') = ' '

Lenny
...
Рейтинг: 0 / 0
11.09.2009, 16:24
    #36191584
Lkhiger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Or even better (for dates only):

авторSelect * from table1
where TRANSLATE(value, '*', ' 123456789') = ' '
and substr(value, 5, 1) in ('.', '-')
and substr(value, 8, 1) in ('.', '-')

Lenny
...
Рейтинг: 0 / 0
11.09.2009, 16:36
    #36191623
Lkhiger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
LkhigerOr even better (for dates only):

авторSelect * from table1
where TRANSLATE(value, '*', ' 123456789') = ' '
and substr(value, 5, 1) in ('.', '-')
and substr(value, 8, 1) in ('.', '-')

Lenny

Sorry. Correction:

Select * from table1
where TRANSLATE(value, '*', ' .-123456789') = ' '
and substr(value, 5, 1) in ('.', '-')
and substr(value, 8, 1) in ('.', '-')[/quot]

Lenny
...
Рейтинг: 0 / 0
11.09.2009, 16:37
    #36191629
Lkhiger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
I did not find EDIT, so:

авторSelect * from table1
where TRANSLATE(value, '*', ' .-123456789') = ' '
and substr(value, 5, 1) in ('.', '-')
and substr(value, 8, 1) in ('.', '-')

Lenny
...
Рейтинг: 0 / 0
11.09.2009, 16:45
    #36191656
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Rust(),

SafeTypeMapping.java
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
import COM.ibm.db2.app.UDF;
import java.text.SimpleDateFormat;

public class SafeTypeMapping extends UDF {
	static SimpleDateFormat sdf_iso = new SimpleDateFormat("yyyy-MM-dd"); 
	SimpleDateFormat sdf = null;

	public void str2int(String str, int __res) throws Exception {
		try {
			set(2, Integer.parseInt(str));
		} catch (NumberFormatException ex) {}
	}
	
	public void str2date(String str, String format, String __res) throws Exception {
		if (this.getCallType() == UDF.SQLUDF_FIRST_CALL) {
			sdf = new SimpleDateFormat(format);
			sdf.setLenient(false);
		}	
		try {
			set(3, sdf_iso.format(sdf.parse(str)));
		} catch (java.text.ParseException ex) {}
	}
}

make_it.batset DB2PATH="C:\PROGRAM FILES\IBM\SQLLIB"
set JDK_PATH=%DB2PATH%\java\jdk
set LIBS=%DB2PATH%\java

%JDK_PATH%\bin\javac -extdirs %LIBS% %1

Компилируем:
make_it.bat SafeTypeMapping.java
Копируем SafeTypeMapping.class в %DB2PATH%\FUNCTION
Регистрируемcreate function safe_int(str varchar(11))
returns int
LANGUAGE Java
EXTERNAL NAME 'SafeTypeMapping.str2int'
DETERMINISTIC
FENCED THREADSAFE
NO SQL
NOT NULL CALL
NO EXTERNAL ACTION
PARAMETER STYLE DB2GENERAL;

create function safe_date(str varchar(10), format varchar(10))
returns date
LANGUAGE Java
EXTERNAL NAME 'SafeTypeMapping.str2date'
DETERMINISTIC
FENCED THREADSAFE
FINAL CALL
NO SQL
NOT NULL CALL
NO EXTERNAL ACTION
PARAMETER STYLE DB2GENERAL;
...
Рейтинг: 0 / 0
11.09.2009, 17:05
    #36191723
Новый Год
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
ещё немного. сходу текст написал, так что если немножко ошибся не обижайтесь

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
extern "C" int safe_int( char * value) 
{

   exec sql begin declare section;
   sqlint32 x;
   char  v[20];
   exec sql end   declare section;
   strcpy(v,value);
   
   exec sql select int( :v) into :x from sysibm.sysdummy1;
   return sqlca.sqlcode;

}

create function safe_int(str char(11))
returns int
LANGUAGE C
EXTERNAL NAME ' С:\somedllpath\somedll!safe_int' // вроде так
DETERMINISTIC
FENCED THREADSAFE
NOT NULL CALL
NO EXTERNAL ACTION
PARAMETER STYLE GENERAL;
...
Рейтинг: 0 / 0
13.09.2009, 01:25
    #36192744
Lkhiger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
I can recommend this SQL to you. You can try.

авторselect column1
from
(select strip( column1) from table1) ii
where
replace( column1, ' ', '') = column1
and
Translate(column1, ' ', '0123456789+-.') = ' '
and
length(replace( column1, '+', '')) >= length(column1) - 1
and
length(replace( column1, '-', '')) >= length(column1) - 1
and
length(replace( column1, '.', '')) >= length(column1) - 1
and
posstr(column1, '-') in (0, 1, length(column1) )
and
posstr(column1, '+') in (0, 1, length(column1) )
and not exists
(select * from sysibm.sysdummy1
where posstr(column1, '-') > 0
and
posstr(column1, '+') > 0)
...
Рейтинг: 0 / 0
13.09.2009, 08:02
    #36192805
Lkhiger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
С вашего позволения я внесу маленькое исправление в код:

авторselect column1
from
(select strip( column1) column1 from table1) ii
where
replace( column1, ' ', '') = column1
and
Translate(column1, ' ', '0123456789+-.') = ' '
and
length(replace( column1, '+', '')) >= length(column1) - 1
and
length(replace( column1, '-', '')) >= length(column1) - 1
and
length(replace( column1, '.', '')) >= length(column1) - 1
and
posstr(column1, '-') in (0, 1, length(column1) )
and
posstr(column1, '+') in (0, 1, length(column1) )
and not exists
(select * from sysibm.sysdummy1
where posstr(column1, '-') > 0
and
posstr(column1, '+') > 0)

Lenny
...
Рейтинг: 0 / 0
13.09.2009, 08:06
    #36192807
Lkhiger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
С вашего позволения я внесу маленькое исправление в код:

авторselect column1
from
(select strip( column1) column1 from table1) ii
where
replace( column1, ' ', '') = column1
and
Translate(column1, ' ', '0123456789+-.') = ' '
and
length(replace( column1, '+', '')) >= length(column1) - 1
and
length(replace( column1, '-', '')) >= length(column1) - 1
and
length(replace( column1, '.', '')) >= length(column1) - 1
and
posstr(column1, '-') in (0, 1, length(column1) )
and
posstr(column1, '+') in (0, 1, length(column1) )
and not exists
(select * from sysibm.sysdummy1
where posstr(column1, '-') > 0
and
posstr(column1, '+') > 0)

Lenny
...
Рейтинг: 0 / 0
13.09.2009, 17:46
    #36193077
Lkhiger
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Никаких UDF. Годится для любой версии DB2.

авторselect column1
from
(select strip(column1) column1 from table1) ii
where
replace( column1, ' ', '') = column1
and
Translate(column1, ' ', '0123456789+-.') = ' '
and
length(replace( column1, '+', '')) >= length(column1) - 1
and
length(replace( column1, '-', '')) >= length(column1) - 1
and
length(replace( column1, '.', '')) >= length(column1) - 1
and
posstr(column1, '-') in (0, 1)
and
posstr(column1, '+') in (0, 1)
and not exists
(select * from sysibm.sysdummy1
where
posstr(column1, '-') > 0
and
posstr(column1, '+') > 0)

Lenny
...
Рейтинг: 0 / 0
14.09.2009, 10:46
    #36193594
Rust()
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Числовое преобразование значения
Большое спасибо!!
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Числовое преобразование значения / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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