【问题标题】:Sql code to get multiple columns out of single columnSql代码从单列中获取多列
【发布时间】:2015-06-06 18:46:40
【问题描述】:

我有一个类似“AP.1.12345.ABCD.20150523_0523.20150524_0223”的列。

我可以根据“.”将列分成多列吗?

对于上面的示例列,输出将类似于

AP 1 12345 ABCD 20150523_0523 20150524_0223.

因此单列将转换为 6 列。

【问题讨论】:

  • 请用您正在使用的数据库标记您的问题,这样我们就不必猜测它是 SQL Server。
  • 我认为这是业务逻辑的工作。检索列的值并将其拆分为应用程序代码(java、.net、php 等)中的六个不同值。数据库是用来保存数据的,不是用来操作数据的
  • @Fabio - 许多类型的 SQL(包括 T-SQL)提供了大量合适的字符串函数,而 ETL 工具,如 SSIS(已标记)也提供了执行此类字符串操作的工具.当然,您可以在应用程序代码中执行此操作,但我们甚至不知道在这种情况下存在应用程序。
  • @Jo Douglass - 我想在 MS SQL SERVER 2008 或更高版本中使用它。无论如何我得到了解决方案..

标签: sql sql-server ssis multiple-columns


【解决方案1】:

在网上四处搜索split() 函数。这并不难。谷歌“SQL Server split”,你会有很多选择。您实际上想要一个为您提供第二个返回值,即子字符串在较大字符串中的位置。

然后:

select t.*, newcols.*
from table t cross apply
     (select max(case when pos = 1 then val end) as col1,
             max(case when pos = 2 then val end) as col2,
             max(case when pos = 3 then val end) as col3,
             max(case when pos = 4 then val end) as col4,
             max(case when pos = 5 then val end) as col5,
             max(case when pos = 6 then val end) as col6             
      from dbo.split(t.col, '.') as s(val, pos)
      group by t.col
     ) newcols;

【讨论】:

    【解决方案2】:

    你也可以写一个函数来做这样的事情:

    DECLARE @Col    VARCHAR(64),
            @DynSQL VARCHAR(MAX)
    
    SET @Col = 'AP.1.12345.ABCD.20150523_0523.20150524_0223'
    SET @DynSQL = 'SELECT '''+REPLACE(@Col,'.',''',''')+''''
    
    exec(@DynSQL)
    

    这可以处理任意数量的分隔符/列。

    【讨论】:

      【解决方案3】:

      感谢大家的建议和解决方案。 我得到了解决方案。经过少量试验,假设列如前所述,我使用 substringcharindex 来获得所需的结果。 虽然查询看起来有点大,但它仍然有效。

      我宁愿它是一个简单的查询而不是使用一个函数。

      需要检查查询的性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-17
        • 2012-01-29
        • 2016-03-27
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多