任何人都可以给我一些线索,如何在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
但我不太明白。
你帮我吗?我现在回到过去很简单的方式。
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
答案 0 :(得分:2)
开箱即用,DB2 不具有处理正则表达式的能力。 一些函数可以处理某些模式匹配,但它受到严格限制。
您链接的文章是如何设置UDF(用户定义函数)以调用外部(C)库来提供此功能。虽然LUW显示了步骤,但iSeries版本应大致相同;你将不得不与你的DBA讨论如何实现对相关库的调用。
答案 1 :(得分:1)
如果不是数字,您可以使用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