【发布时间】:2010-02-18 14:38:03
【问题描述】:
我有一个包含以下值的字段:
A12345
AB456
1234
AA 45
是否可以在两个单独的列中选择这些作为数字和字母。
提前致谢
【问题讨论】:
-
第五行示例中的空格是包含在字母中还是被丢弃?
-
请提供您使用的数据库品牌,因为 SQL 功能因引擎而异。例如,有些允许正则表达式,有些则不允许。
我有一个包含以下值的字段:
A12345
AB456
1234
AA 45
是否可以在两个单独的列中选择这些作为数字和字母。
提前致谢
【问题讨论】:
如果您没有正则表达式,那么也许这样的东西会为您解决。
SQL> with t as ( select 'A12345' as str from dual
2 union all
3 select 'AB456' as str from dual
4 union all
5 select '1234' as str from dual
6 union all
7 select 'AA 45' as str from dual)
8 select str
9 , replace(translate(str, '0123456789'
10 , ' '), ' ', null) as AAA
11 , replace(translate(str, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
12 , ' '), ' ', null) as NNN
13 from t
14 /
STR AAA NNN
------ ------ ------
A12345 A 12345
AB456 AB 456
1234 1234
AA 45 AA 45
SQL>
translate() 函数将数字(或字母)转换为空格,然后replace() 将空格转换为 NULL。
【讨论】:
如果您使用的 SQL 引擎支持用户定义的函数,您可以编写代码来解析它并返回一个唯一值表。但是,如果您要经常这样做,最好将它们存储为单独的字段,这样您就可以使用 DML 而不是自定义代码来操作它们。
【讨论】:
如果您使用的是 SQL Server 2005,则可以通过 CLR 集成调用 .NET 代码(例如 C# 或 VB.NET 正则表达式功能)。这是一篇让您入门的文章,我相信 Google 会出现更多:http://msdn.microsoft.com/en-us/magazine/cc163473.aspx
【讨论】:
create table tbl(data varchar(200))
insert into tbl(data)
select 'A12345' data union all
select 'AB456' union all
select '1234' union all
select 'AA 45'
-------------
select LEFT(data, PATINDEX('%[0-9]%', data)-1) as Letters,
CAST(SUBSTRING(data, PATINDEX('%[0-9]%', data), 10000) AS INT) as Numbers
from tbl
【讨论】: