SQL将列拆分为具有多个分隔符的3个不同列

时间:2016-12-09 12:26:49

标签: sql sql-server select substring

我的下面的列包含如图所示的数据

|DeliveryComment          |   
|-------------------------|    
|[1 * B018]               |  
|GARAGE                   |  
|BACK GARDEN. [124 * B002]|   
|[1 * B018]               |  
|                         |  
|[124 * B002]             |   
|[1 * B018]               |  
|                         |    
|[124 * B002]             |   

我想将这些数据拆分为三列,如下所示。

|ColA       |ColB|ColC|  
|-----------|----|----|     
|           |1   |B018|   
|GARAGE     |    |    |   
|BACK GARDEN|124 |B002|  
|           |1   |B018|    
|           |    |    |    
|           |124 |B002|   
|           |1   |B018|  
|           |    |    |      
|           |124 |B002|

应该在A列中结束的数据最多可以变为11个字符。 应该在B列中结束的数据可以是最多3个字符的可变数值。 应该在C列中结束的数据最多可以变换4个字符。

数字周围总会有[],并且它们之间始终会有*

2 个答案:

答案 0 :(得分:1)

Create and populate sample table (Please save us this step in your future questions)

DECLARE @t AS TABLE
(
    col  varchar(50) 
)

INSERT INTO @T VALUES
('[1 * B018]'),
('GARAGE'),
('BACK GARDEN. [124 * B002]'),
('[1 * B018]'),
(''),
('[124 * B002]'),
('[1 * B018]'),           
(''),
('[124 * B002]')

The query:

SELECT CASE WHEN charindex('[', col) > 0 THEN
           LEFT(col, charindex('[', col)-1)
       ELSE
           col
       END AS ColA,

       CASE WHEN charindex('[', col) = 0 THEN
           ''
       ELSE
           SUBSTRING(col, charindex('[', col) +1 ,charindex('*', col) - charindex('[', col) - 1)
       END AS ColB,

       CASE WHEN charindex('[', col) = 0 THEN
           ''
       ELSE
           SUBSTRING(col, charindex('*', col) +1 ,charindex(']', col) - charindex('*', col) - 1)
       END AS ColC
FROM @T

Results:

ColA            ColB    ColC
                1       B018
GARAGE      
BACK GARDEN.    124     B002
                1       B018

                124     B002
                1       B018

                124     B002

答案 1 :(得分:0)

此解决方案使用CROSS APPLY使CHARINDEX更易于管理。

    private void AppClickCommandExecuted(IList<DataGridCellInfo> cells)
    {
        if(cells != null && cells.Count > 0)
        {
            DataGridCellInfo cellInfo = cells[0];
            FrameworkElement cellContent = cellInfo.Column.GetCellContent(cellInfo.Item);
            if (cellContent != null)
            {
                DataGridCell cell = cellContent.Parent as DataGridCell;
                if(cell != null)
                {
                    Point screenCoordinates = cell.PointToScreen(new Point(0, 0));
                    //place your popup based on the screen coordinates of the cell...
                }
            }
        }
    }

注意:到目前为止你所拥有的例子 - 包括这个例子 - 目前有前导空格和尾随空格需要用RTRIM&amp; amp; LTRIM。但是现在他们会把代码搞砸。