Написание SQL для этого очень быстро станет очень сложным, с кучей вложенных функций Mid () и InStr ().
Вместо этого я бы сделал это с помощью функции, которая использует Split ().
Public Function SplitField(varInput As Variant, strDelimiter As String, lngItemRequested As Long) As Variant
Dim varTemp As Variant
Dim arrInput() As String
varTemp = varInput
If Left(varTemp, 1) = strDelimiter Then
varTemp = Mid(varTemp, 2)
End If
If right(varTemp, 1) = strDelimiter Then
varTemp = Left(varTemp, Len(varTemp) - 1)
End If
arrInput = Split(varTemp, strDelimiter)
If lngItemRequested - 1 <= UBound(arrInput()) Then
SplitField = arrInput(lngItemRequested - 1)
If SplitField = vbNullString Then
SplitField = Null
End If
Else
SplitField = Null
End If
End Function
Тогда в SQL вы бы назвали это так:
INSERT INTO TargetTable( Field1, Field2, Field3, Field4 )
SELECT SourceTable.SourceField, SplitField([SourceField],"|",1),
SplitField([SourceField],"|",2),
SplitField([SourceField],"|",3),
SplitField([SourceField],"|",4)
FROM SourceTable
Обратите внимание, что написанную мною функцию можно использовать даже в том случае, если в исходном поле есть переменное число частей. То есть, если у некоторых есть 4 части, а у некоторых 2, это не имеет значения, так как функция возвращает Null для частей, которых там нет.