2016-04-06 8 views
1

以下は、次の表を分割するために作成されたクエリです。 3番目の列は接尾辞です。このフィールドの前の列は、返されたフィールドの末尾にある接尾辞を削除しません。私は結果と問題のイメージだけでなく、クエリを添付しています。単一のデータベースフィールドを複数のフィールドに分割する

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; 

3つの列が分割されており、3つ目のように表示されます。ただし、中央の列は最後の接尾辞を保持しています。これを解決するには?につながるSTART_POSITION後

Mid (text, start_position, number_of_characters) 

あなたが最後のパラメータを指定しない場合は、mid機能が返すすべての文字、:

enter image description here

答えて

1

理由はmid機能は3つのパラメータを期待していることですあなたの結果。

試してみてください。

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

しかし、その式はかなり複雑で、そしてあなたの他のフィールドの式は、すでにかなり複雑です - :

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

@MR:また、あなたはまた、サフィックス部分は 'InStrRev'を使用する必要があります。現在のところ、このパーツが動作するのは運のみです(最初の " - "は常に2番の位置にあります)。 – Andre

1

この式は、私はあなたが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 
関連する問題