我一直在寻找一个SQL函数来测试alpha或数字的值。对于Informix 7.3,似乎没有这样的函数,但我可能错过了一些东西或者一直在寻找错误的东西。
例如,我正在尝试测试一个电话号码字段,其中只包含数字并相应地处理它:
鉴于此表格的电话字段类型为char(12)
:
id name phone
5164 Cheese 973-153-5149
8843 Queso (201)8011830
8356 Formaggio 2129182943
8938 Ost ext.21438
3852 Ser 973-15-1549
我想做这样的事情:
SELECT CASE WHEN (ISALPHA((TRIM(REPLACE((REPLACE((REPLACE((REPLACE((REPLACE(phone,'-','')),'(','')),')','')),' ','')),'.','')))))
THEN 'has alpha chars'
WHEN (LENGTH((TRIM(REPLACE((REPLACE((REPLACE((REPLACE((REPLACE(phone,'-','')),'(','')),')','')),' ','')),'.','')))) NOT IN (10,11))
THEN 'wrong length'
WHEN (phone IN ('',' ',NULL)))
THEN 'phone is blank'
ELSE (TRIM(REPLACE((REPLACE((REPLACE((REPLACE((REPLACE(phone,'-','')),'(','')),')','')),' ','')),'.','')))
END phone
FROM given_table;
基本上,我正在尝试从电话号码中移除所有-
,(
,)
,,
.
字符,修剪结果测试它的长度是10或11个字符长,并确保在所有替换和修剪后数据中没有alpha字符。 (如果你觉得我更换和修剪的方式有什么问题,我也会对这方面的建议持开放态度。正则表达式?)
我想要的最终结果是:
phone
9731535149
2018011830
2129182943
has alpha chars
wrong length
我读过一个solution(Oracle),建议使用LENGTH
,TRIM
和TRANSLATE
的组合,但不支持TRANSLATE
Informix 7.3
答案 0 :(得分:3)
这是我发现测试alpha的方法。这是一种解决方法,但我认为到目前为止它是可靠的。
SELECT phone FROM given_table WHERE UPPER(phone)<>LOWER(phone);
参考:http://www.geekinterview.com/question_details/34549(请参阅用户“amarnathtnl”的回答,距离页面的一半)
答案 1 :(得分:1)
这可靠地运作:
CREATE FUNCTION to_int(alpha VARCHAR(16)) RETURNING INT;
DEFINE n INT;
ON EXCEPTION IN (-1213) RETURN NULL; END EXCEPTION;
LET n = alpha;
RETURN n;
END FUNCTION;
它产生数字ot NULL。