【问题标题】:SQL Split like Select像 Select 一样的 SQL 拆分
【发布时间】:2010-02-18 14:38:03
【问题描述】:

我有一个包含以下值的字段:

A12345
AB456
1234
AA 45

是否可以在两个单独的列中选择这些作为数字和字母。

提前致谢

【问题讨论】:

  • 第五行示例中的空格是包含在字母中还是被丢弃?
  • 请提供您使用的数据库品牌,因为 SQL 功能因引擎而异。例如,有些允许正则表达式,有些则不允许。

标签: sql split


【解决方案1】:

如果您没有正则表达式,那么也许这样的东西会为您解决。

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。

【讨论】:

    【解决方案2】:

    如果您使用的 SQL 引擎支持用户定义的函数,您可以编写代码来解析它并返回一个唯一值表。但是,如果您要经常这样做,最好将它们存储为单独的字段,这样您就可以使用 DML 而不是自定义代码来操作它们。

    【讨论】:

      【解决方案3】:

      如果您使用的是 SQL Server 2005,则可以通过 CLR 集成调用 .NET 代码(例如 C# 或 VB.NET 正则表达式功能)。这是一篇让您入门的文章,我相信 Google 会出现更多:http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

      【讨论】:

        【解决方案4】:
        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
        

        【讨论】:

        • 我可以算是 sql 的新手……您对这个解决方案有什么看法?谢谢。选择'ABC34567',替换(替换(替换(替换(替换(替换(替换(替换(替换(替换('ABC34567','1',''),'2',''),'3',' '),'4',''),'5',''),'6',''),'7',''),'8',''),'9','') ,'0',''), SUBSTRING('ABC34567',LEN(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('ABC34567','1',''),' 2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8' ,''),'9',''),'0',''))+1,LEN('ABC34567'))
        猜你喜欢
        • 2012-02-14
        • 1970-01-01
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        • 2014-06-13
        • 1970-01-01
        相关资源
        最近更新 更多