Regex IBM DB2 iSeries - PullRequest
       10

Regex IBM DB2 iSeries

2 голосов
/ 15 ноября 2011

Может кто-нибудь подсказать, как создать / вызвать синтаксис регулярных выражений функций в DB2 iSeries.

Пример:

DECLARE VAL VARCHAR (16) DEFAULT 'abcde1235876e' ;
DECLARE RET INT DEFAULT 0;

Я просто проверяю, VARIABLE VAL должен содержать только числовое значение и возвращать true / false

SET VAL = I_NEED_FUNCTION_REGEX(VAL);
IF (VAL = true) THEN
SET RET = 1;
ELSE
SET RET = 0;
END IF;

так просто, но я искал в IBM следующее:

http://www.ibm.com/developerworks/data/library/techarticle/0301stolze/0301stolze.html

но я не совсем понимаю.

Ты можешь мне помочь?


UPDATE

Я вернулся к старому и пока простому.

CREATE FUNCTION TEST.VALIDATE_NUMERIC (VAL CHARACTER VARYING(1))
RETURNS INTEGER
LANGUAGE SQL
SPECIFIC TEST.VALIDATE_NUMERIC
MODIFIES SQL DATA
CALLED ON NULL INPUT
FENCED
DISALLOW PARALLEL
NO EXTERNAL ACTION
BEGIN ATOMIC
DECLARE RET INT DEFAULT 0 ;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION , SQLWARNING , NOT FOUND

IF ( VAL IS NOT NULL ) THEN

CASE VAL
WHEN 0 THEN -- (0)
SET RET = 1 ;
WHEN 1 THEN -- (1)
SET RET = 1 ;
WHEN 2 THEN -- (2)
SET RET = 1 ;
WHEN 3 THEN -- (3)
SET RET = 1 ;
WHEN 4 THEN -- (4)
SET RET = 1 ;
WHEN 5 THEN -- (5)
SET RET = 1 ;
WHEN 6 THEN -- (6)
SET RET = 1 ;
WHEN 7 THEN -- (7)
SET RET = 1 ;
WHEN 8 THEN -- (8)
SET RET = 1 ;
WHEN 9 THEN -- (9)
SET RET = 1 ;
ELSE
SET RET = 0 ;
END CASE ;

END IF ;

RETURN RET ;  
END 
GO

Спасибо
MRizq

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

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

Статья, которую вы связали, посвящена настройке UDF (пользовательской функции) для вызова внешнего(C) библиотека для обеспечения этой функциональности.Хотя шаги показаны для LUW, версия iSeries должна быть примерно эквивалентна;вам нужно будет убедить ваших администраторов баз данных осуществить вызов в соответствующие библиотеки.

1 голос
/ 19 ноября 2011

Вы можете использовать LOCATE(VAL, '0123456789'), чтобы вернуть 0, если не числовой, и цифру + 1, если найдено:

CASE LOCATE(VAL, '0123456789') WHEN > 0 THEN 1 ELSE 0 END

Для многосимвольной строки вы можете использовать следующее:

CASE WHEN TRANSLATE(TRIM(VAL), '0', '0123456789', '0') 
    = REPEAT('0', LENGTH(TRIM(VAL))) 
THEN 1 ELSE 0 END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...