Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从查询中选择单词的一部分?_Sql_Ms Access 2007 - Fatal编程技术网

Sql 从查询中选择单词的一部分?

Sql 从查询中选择单词的一部分?,sql,ms-access-2007,Sql,Ms Access 2007,在Access中,我有这样一个字段: 从开始到2013年5月1日结束,使用了XXXXXXX设备 我正在寻找一个查询,可以提取本例中的设备名称XXXXXXX。我能够使用mid使它在某种程度上起作用,但句子可以更长或更短。还有什么其他方法可以做到这一点?是否可以使用查找来查找设备的位置 我的SQL看起来像: SELECT Mid(Note, 68, 30) FROM My_Log WHERE Note LIKE "*, the*" ; 如果您知道设备的名称,可以使用Instr: ... WHER

在Access中,我有这样一个字段:

从开始到2013年5月1日结束,使用了XXXXXXX设备

我正在寻找一个查询,可以提取本例中的设备名称XXXXXXX。我能够使用mid使它在某种程度上起作用,但句子可以更长或更短。还有什么其他方法可以做到这一点?是否可以使用查找来查找设备的位置

我的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] & "*"
如果您需要知道在notes中的何处可以找到该设备


除了我的评论之外,这是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
   ))))
  /

如果设备名称是设备之前的单词,并且您希望仅使用Access db引擎直接支持的函数查找该单词,则Mid、InStr和InstrRev可以完成此任务。。。但它不会很漂亮

这是一个即时窗口会话

注=从开始到2013年5月1日结束,使用了XXXXXXX设备。 ? 中音_ InstrRevNote,InStr1,注释,装置-1+1_ InStr1,注释,设备-INSTREVNOTE,,InStr1,注释,设备-1-1 XXXXXXX 因此,您需要在查询中使用该复杂的Mid表达式

但是,如果可以在查询中使用用户定义的函数,那么逻辑可能更易于管理

公共函数FindDeviceByVal pInput作为字符串作为变量 把单词当作字符串 我想我会坚持多久 朦胧而深沉 Dim varReturn作为变体 varReturn=Null astrWords=SplitpInput, lngUBound=ubounds 对于i=0到lngUBound 如果AstWordSi=设备,则 varReturn=astrWordsi-1 退出 如果结束 接下来我 FindDevice=varReturn 端函数 那么查询可能是

选择FindDeviceNode作为设备名称 从我的日志 如*,则为*
我不访问,但我知道SUBSTR和INSTR函数是ANSI SQL的一部分。你可以使用这些函数来剪切你需要的那部分单词。我很好奇,为什么你说你想要一个答案来挑选设备,但接受一个答案,在设备使用UDF之前挑选出单词,这对于简单地选择设备来说是不必要的?也许你可以重新表述你的问题,让你的答案选择更清晰?对不起,这不是指在用户输入中选择。我的意思是SQL代码将从字符串中选择设备名称。在Access SQL中:从SELECT str str str STRU starts中选择Midstr_starts,1,end_pos作为机器名称,“-1作为SELECT Midstr中的end_pos,从SELECT str str str str str str str str str str str str str str str str str str str str str starts中选择starts,INS,“XXXXXXX”作为起始位置,选择“从开始到2013年5月1日结束,使用了XXXXXXX设备”。作为dual@HansUp的str,您应该将其添加到答案而不是注释中。这是一个很好的例子…这只是您答案的Access SQL版本。我希望你能把它包括在你的答案中。@HansUp,不,我不能这样做,我想除了你之外,没有人能像你应该做的那样把它升级为答案。谁先写等都不重要。。。我们正在努力帮助别人。
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
   ))))
  /