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

如果您知道设备的名称,则可以使用 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

除了我的评论之外,这是可能对您有所帮助的 Oracle 查询。将 dual with 替换为您的表名,查询应该可以工作。正如我提到的,我在此查询中使用的所有函数都是 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

如果设备名称是“设备”之前的单词,并且您想仅使用 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 回答