在 Access 中,我有一个这样的字段:
从 2013 年 1 月 5 日开始到结束,使用 XXXXXXX 设备。
我正在寻找可以提取设备名称的查询(在本例中为 XXXXXXX)。我可以使用 mid() 让它有点工作,但句子可能更长或更短。还有哪些其他方法可以做到这一点?是否有一个 find() 可以用来查找“设备”的位置?
我的 SQL 看起来像:
SELECT Mid(Note, 68, 30)
FROM My_Log
WHERE Note LIKE "*, the*"
;
在 Access 中,我有一个这样的字段:
从 2013 年 1 月 5 日开始到结束,使用 XXXXXXX 设备。
我正在寻找可以提取设备名称的查询(在本例中为 XXXXXXX)。我可以使用 mid() 让它有点工作,但句子可能更长或更短。还有哪些其他方法可以做到这一点?是否有一个 find() 可以用来查找“设备”的位置?
我的 SQL 看起来像:
SELECT Mid(Note, 68, 30)
FROM My_Log
WHERE Note LIKE "*, the*"
;
如果您知道设备的名称,则可以使用 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]) ...
除了我的评论之外,这是可能对您有所帮助的 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
))))
/
如果设备名称是“设备”之前的单词,并且您想仅使用 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*"