Writing SQL to do this will get very complicated very quickly, with a bunch of nested Mid() and InStr() functions.
Instead, I'd do it with a function that uses 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
Then in SQL, you'd call it thus:
INSERT INTO TargetTable( Field1, Field2, Field3, Field4 )
SELECT SourceTable.SourceField, SplitField([SourceField],"|",1),
SplitField([SourceField],"|",2),
SplitField([SourceField],"|",3),
SplitField([SourceField],"|",4)
FROM SourceTable
Note that the function I wrote can be used even when there is a variable number of subparts in the source field. That is, if some have 4 parts and some 2, it doesn't matter, as the function returns Null for the parts that aren't there.