これを行っているコンテキストについては言及していません...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