我的下面的列包含如图所示的数据
|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个字符。
数字周围总会有[]
,并且它们之间始终会有*
。
答案 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。但是现在他们会把代码搞砸。