1

Access には、次のようなフィールドがあります。

2013 年 1 月 5 日の開始から終了まで、XXXXXXX デバイスが使用されていました。

デバイス名 (この場合は XXXXXXX) を抽出できるクエリを探しています。mid() を使用してある程度機能させることができましたが、文が長くなったり短くなったりする可能性があります。これを行う他の方法は何ですか?「デバイス」の場所を見つけるために使用できる find() はありますか?

私のSQLは次のようになります:

SELECT Mid(Note, 68, 30)
FROM My_Log
WHERE Note LIKE "*, the*"
;
4

3 に答える 3

1

私のコメントに加えて、これはあなたを助けるかもしれないOracleクエリです。dual をテーブル名に置き換えると、おそらくクエリが機能するはずです。前述したように、このクエリで使用しているすべての関数は ANSI SQL 標準です。自分で修正できる構文。すべてのクエリを個別に実行して、マシン名の開始位置、終了位置、長さなどを取得できます...:

SELECT SUBSTR(str, start_pos, end_pos) machine_name
  FROM
  (
   SELECT str, INSTR(str,'XXXXXXX') start_pos, Length('XXXXXXX') end_pos
     FROM
   (
   SELECT 'From the start until end at 01/05/2013, the XXXXXXX device was used.' str FROM dual
   )
 )
 /

SQL> 

MACHINE
-------
XXXXXXX

同じ結果をもたらすより一般的なアプローチ - 長さを排除:

SELECT SUBSTR(str_starts, 1, end_pos) machine_name FROM -- Final string
(
 SELECT str_starts, INSTR(str_starts, ' ')-1 end_pos FROM -- end pos = last X pos in string starts - in 'XXXXXXX'
 (
  SELECT SUBSTR(str, start_pos) str_starts FROM    -- strig starts from first X
  (
   SELECT str, INSTR(str,'XXXXXXX') start_pos FROM  -- start_pos
   (
    SELECT 'From the start until end at 01/05/2013, the XXXXXXX device was used.' str FROM dual
   ))))
  /
于 2013-01-23T16:10:30.233 に答える
1

デバイスの名前がわかっている場合は、Instr を使用できます。

 ... WHERE Instr([Note], "Mydevice")>0

デバイスを一覧表示する表を使用することもできます。

SELECT Note FROM MyTable, ListTable
WHERE Note Like "*" & ListTable.Devices & "*"

再コメント:

SELECT Note
FROM MyTable
WHERE [Note] Like "*" & [enter device] & "*"

メモのどこにデバイスがあるかを知る必要がある場合

SELECT Note, InStr([Note],[enter device]) ...
于 2013-01-23T15:54:39.873 に答える
1

デバイス名が「デバイス」の前の単語であり、Access db エンジンによって直接サポートされている関数のみを使用してその単語を検索したい場合、Mid()InStr()、そしてInstrRev()仕事を成し遂げることができます...しかし、それはきれいではありません.

これがイミディエイト ウィンドウ セッションです ...

Note = "From the start until end at 01/05/2013, the XXXXXXX device was used."
? Mid(Note, _
InstrRev(Note, " ", InStr(1, Note, " device") -1) +1, _
InStr(1, Note, " device") - InstrRev(Note, " ", InStr(1, Note, " device") -1) -1)
XXXXXXX

Mid()そのため、その複雑な式をクエリで使用する必要があります。

ただし、クエリでユーザー定義関数を使用できる場合は、ロジックの管理が容易になる可能性があります。

Public Function FindDevice(ByVal pInput As String) As Variant
    Dim astrWords() As String
    Dim i As Long
    Dim lngUBound As Long
    Dim varReturn As Variant

    varReturn = Null
    astrWords = Split(pInput, " ")
    lngUBound = UBound(astrWords)
    For i = 0 To lngUBound
        If astrWords(i) = "device" Then
            varReturn = astrWords(i - 1)
        Exit For
    End If
    Next i
    FindDevice = varReturn
End Function

次に、クエリは...

SELECT FindDevice(Note) AS device_name
FROM My_Log
WHERE Note LIKE "*, the*"
于 2013-01-23T16:56:20.680 に答える