我的专栏的客户编号既是数字又是文字和数字的组合。如果它们都是数字,我只想转换它们,否则将它们留作字符串
ex.
91036
ab321
10001
仅将91036
和10001
转换为数字(使用强制转换或转换),但将ab321保留为字符串。我尝试过isnumeric,但这不是我正在使用的查询构建器中的已识别函数。如果我使用强制转换或转换,字符串正在消失。
答案 0 :(得分:0)
这是一个基于Oracle的示例,但我相信相同的原则可以在其他地方使用(至少在支持正则表达式的数据库中)。
我不太明白你的意思是说你想把这些值“转换”成数字;转换在哪里?我假设它们当前存储在VARCHAR2(或其他一些“字符”数据类型列)中。将它们转换为数字是没有用的,将它们留在同一列中,因为它不会做任何事情 - 它们仍将被视为字符串(存储在字符数据类型列中,还记得吗?)
所以,我创建了另一个 - NUMBER数据类型列,并尽可能用数字填充它。
示例数据:
SQL> create table test (col_char varchar2(10),
2 col_num number);
Table created.
SQL> insert into test (col_char)
2 (select '91036' from dual union
3 select 'ab321' from dual union
4 select '10001' from dual
5 );
3 rows created.
更新使用REGEXP_LIKE函数检查COL_CHAR是否看起来像数字:
^
将您锚定在字符串的开头\d+
可以获取尽可能多的连续数字$
将您固定在字符串的末尾,一起表示字符串必须以数字开头,必须以数字结尾,其间的所有内容都必须是数字。
SQL> update test set
2 col_num = to_number(col_char)
3 where regexp_like(col_char, '^\d+$');
2 rows updated.
SQL> select * From test;
COL_CHAR COL_NUM
---------- ----------
10001 10001
91036 91036
ab321
SQL>
当字符串中有小数和/或千位分隔符时,事情会变得更复杂,因此您可能需要更改TO_NUMBER函数和正则表达式模式。例如:
SQL> update test set
2 col_num = to_number(col_char, '999990D00000', 'nls_numeric_characters = '',.''')
3 where regexp_like(col_char, '^[0-9]+|(\,)[0-9]+$');
2 rows updated.
SQL> select * from test;
COL_CHAR COL_NUM
---------- ----------
10001 10001
91,036 91,036
ab321
SQL>