2016-04-06 5 views
1

Ниже приведен запрос, написанный для разделения следующих таблиц. Третий столбец - суффикс, а столбец перед этим полем не будет обрезать -suffix с конца возвращаемого поля. Я приложил запрос, а также изображение результатов и проблемы.Разделение одного поля базы данных на несколько полей

SELECT Left([ADDRESS_ID],InStr([ADDRESS_ID],"-")-1) AS Abbreviation, 
     Mid([ADDRESS_ID],InStr([ADDRESS_ID],"-")+1) AS CODE, 
     Right([ADDRESS_ID],InStr([ADDRESS_ID],"-")) AS SUFFIX, 
     MDM_Address_Remote_Key.ADDRESS_ID 
FROM MDM_Address_Remote_Key; 

Три столбца разбиты и должны быть похожими на третье; однако средний столбец удерживается на суффиксе в конце. Как это решить?

enter image description here

ответ

1

Причина заключается в том, что mid функция ожидает 3 параметра:

Mid (text, start_position, number_of_characters) 

Если не указать последний параметр, функция mid будет возвращать все символы после начальная_позиция, которые приводят к ваш результат.

Try:

Mid([ADDRESS_ID],InStr([ADDRESS_ID],"-")+1,InStrRev([ADDRESS_ID],"-")-(InStr([ADDRESS_ID],"-")+1)) AS CODE 
+0

@MR: Кроме того, вы также должны использовать 'InStrRev' для суффикса части. В настоящее время только удача (первая «всегда» находится в позиции 2), что эта часть работает. – Andre

1

Это выражение извлекает подстроку Я думаю, что вы хотите для CODE:

Mid([ADDRESS_ID], InStr(1, [ADDRESS_ID], "-") + 1, InStrRev([ADDRESS_ID], "-") - InStr(1, [ADDRESS_ID], "-") - 1) AS CODE 

Однако это выражение является довольно сложным, и ваши другие выражения поля уже достаточно сложный - - продолжаются целые функции лотты.

Если вы выполняете запрос из сеанса доступа, вы можете использовать пользовательскую функцию, которая использует функцию VBA Split().

Тогда ваш запрос может быть проще и понятнее.

SELECT SplitSegment([ADDRESS_ID], "-", 0) AS Abbreviation, 
     SplitSegment([ADDRESS_ID], "-", 1) AS CODE, 
     SplitSegment([ADDRESS_ID], "-", 2) AS SUFFIX, 
     MDM_Address_Remote_Key.ADDRESS_ID 
FROM MDM_Address_Remote_Key; 
Public Function SplitSegment(ByVal pSource As Variant, _ 
     ByVal pDelimter As String, _ 
     ByVal pIndex As Long) As Variant 

    Dim varOut As Variant 
    varOut = Null 
    If Not IsNull(pSource) Then 
     varOut = Split(pSource, pDelimter)(pIndex) 
    End If 
    SplitSegment = varOut 
End Function