2

こんにちは、

アクセスクエリで2文字の間にある最初の文字列を取得する文字列(URL)があります。

http://websiteurl.com/sometext-STUFFIWANT-foo-bar

すべてのテキストは可変であり、URLにはさまざまな数の「-」が含まれています。

私は最初の出現の位置を得ることができます:

Instr([column],"-")+1

そして私は次のようなものが欲しいと思います:

Mid(
    [column],
    Instr([column],"-")+1,
    InStr(InStr(1,[column],"-")-1,[column],"-")
)

ただし、これにより、文字列の最初のチャンクが得られ、その後に必要なテキストの一部が続きます。

私は理想的には、「最初の位置-、2番目の位置-を取得し、それらの2つの位置の間のすべてのテキストを返す」ことを望んでいます。

私は少し円を描いて回っています、そして私は近くにいると思いますが、私はもう進歩していません。

4

3 に答える 3

5

これを行っているコンテキストについては言及していません...VBAプロシージャ、Accessでのクエリ、Accessセッションの外部からのクエリ。Split()しかし、この関数を使用できれば、これは非常に簡単です。イミディエイトウィンドウからこの例を検討してください。

strUrl = "http://websiteurl.com/sometext-STUFFIWANT-foo-bar"
varPieces = Split(strUrl, "-")
? varPieces(1)
STUFFIWANT

クエリでこれを実行したいと言ったので、次のようなものを探していると思います...

SELECT
    Mid(
        [column],
        InStr([column], "-") +1,
        (InStr(InStr([column], "-") +1, [column], "-") - InStr([column], "-")) -1
        ) AS stuff_i_want
FROM YourTable;

それでも十分かもしれません。ただし、がNullの場合は常に、「Nullの無効な使用」エラーがスローされます[column][column]また、ダッシュが2つ未満の値でも窒息します。あなたがそれらの制限に対処することができれば、あなたは行ってもいいかもしれません。しかし、その複雑なフィールド式を変更する必要がある場合は...頑張ってください!

Split()これがAccessアプリケーションセッション内から実行するクエリである場合は、前に示した例に基づいてユーザー定義関数を作成できます。そうすれば、クエリを簡単に作成できます。

SELECT
    GetStuffYouWant([column]) AS stuff_i_want
FROM YourTable;

UDFのクエリが遅くなる可能性があるという警告を聞いたことがあるかもしれません。ただし、この場合、代替手段はMid()プラスの関数の束でありInStr()、それはdbエンジンにとって実際には簡単なワークロードではありません。両方のアプローチを、1,000万行を超えるテーブルと比較しました。DAOレコードセットを完全に取り込むのにかかった時間は、37〜45秒の範囲であり、どちらのアプローチも一貫した勝者ではありませんでした。

UDFアプローチを自分で試してみたい場合は、以下の関数を含めました。そして、これがさまざまな入力値で関数をテストするイミディエイトウィンドウセッションです。

? GetStuffYouWant(Null)
Null
? GetStuffYouWant("")
Null
? GetStuffYouWant("abc")
Null
? GetStuffYouWant("abc-")
Null
? GetStuffYouWant("abc-def")
Null
? GetStuffYouWant("abc-def-")
def
? GetStuffYouWant("http://websiteurl.com/sometext-STUFFIWANT-foo-bar")
STUFFIWANT

そして機能..。

Public Function GetStuffYouWant(ByVal pInput As Variant, _
        Optional pSplitChar As String = "-") As Variant
    Dim varResult As Variant
    Dim varPieces As Variant

    If IsNull(pInput) Then
        varResult = Null
    Else
        varPieces = Split(pInput, pSplitChar)
        If UBound(varPieces) > 1 Then
            varResult = varPieces(1)
        Else
            varResult = Null
        End If
    End If
    GetStuffYouWant = varResult
End Function
于 2013-02-26T17:47:46.483 に答える
0

あなたのコードは本当に近いです。これはあなたがやりたいことですか?

   dim first as integer
  dim second as integer
   dim result as string
   first = instr(1,"yourtext","-")
    second = instr(first+1,"yourtext","-")

   if first > 0 and second > first then
           second = second - first
            result = mid("yourtext",first+1, second-1)
     end if

「xx-bbb-cc」の場合、結果は「bbb」になります

「xx-bbb-cc-zz-cc」の場合、結果は「bbb」になります

xxxx-bbbの場合、結果はありません

于 2013-02-26T17:26:12.990 に答える
0

同じ問題があります。これは、開始ビットと終了ビットの区切り文字として文字列を許可し、2番目の区切り文字が見つからない場合でも、テスト文字列内から中間ビットを見つけることができる関数です。

Public Function middlebit(startbit, endbit, teststring)
Dim first As Integer
Dim second As Integer
middlebit = ""
If teststring <> "" Then
    first = InStr(1, teststring, startbit)
    second = InStr(first + Len(startbit), teststring, endbit)
    If second = 0 Then second = Len(teststring)
    If first > 0 And second > first Then
        second = second - first
        middlebit = Mid(teststring, first + Len(startbit), second - Len(startbit))
    End If
End If

終了機能

于 2016-10-06T12:22:29.027 に答える