如何将字符串转换为数字(如果是数字),否则在SQL中保留为字符串

时间:2018-03-23 15:49:11

标签: sql database

我的专栏的客户编号既是数字又是文字和数字的组合。如果它们都是数字,我只想转换它们,否则将它们留作字符串

ex.
91036
ab321
10001

仅将9103610001转换为数字(使用强制转换或转换),但将ab321保留为字符串。我尝试过isnumeric,但这不是我正在使用的查询构建器中的已识别函数。如果我使用强制转换或转换,字符串正在消失。

1 个答案:

答案 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>