Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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/5/url/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_Sql Server - Fatal编程技术网

从SQL中的行中搜索并提取单词

从SQL中的行中搜索并提取单词,sql,sql-server,Sql,Sql Server,我有一张桌子和下一张桌子 表A Text,id,Cid,CName,Aid,AName Acc.sa is very Acc.pa and Acc.ba is awesome, 1,2,AB,1,CC Acc.aa is awesome and Acc.sas is great,2,3,CC,1,CC Acc.ee is not only great but Acc.sew is best,4,3,FF,1,CC 它应该获取与Acc相关的所有单词,因此结果应该是 Did,id,Cid,CNa

我有一张桌子和下一张桌子

表A

Text,id,Cid,CName,Aid,AName
Acc.sa is very Acc.pa and Acc.ba is awesome, 1,2,AB,1,CC
Acc.aa is awesome and Acc.sas is great,2,3,CC,1,CC
Acc.ee is not only great but Acc.sew is best,4,3,FF,1,CC
它应该获取与Acc相关的所有单词,因此结果应该是

 Did,id,Cid,CName,Aid,AName
 Acc.sa,1,2,AB,1,CC
 Acc.pa,1,2,AB,1,CC
 Acc.ba,1,2,AB,1,CC
 Acc.aa,2,3,CC,1,CC
 Acc.sas,2,3,CC,1,CC
 Acc.ee,4,3,FF,1,CC
 Acc.sew,4,3,FF,1,CC
i、 e.每次搜索都应该有一个新行


我尝试了CHARINDEX和子字符串,但我不确定如何在SELECT语句中继续使用CHARINDEX和子字符串。非常感谢您的帮助

您将需要使用递归CTE对每个事件执行子串。今天早上我工作很忙,所以我无法创建与您的特定模式相匹配的内容,但这里有一个例子,我过去曾从字符串中提取所有PDF文件名。所有注释掉的行都是为了显示我是如何获得需要提取的PDF文件名的构建块。您将需要为您的场景相应地修改模式搜索。这是一本书

with base10 as (
    select n
    from (values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) v(n)
), k as (
    select d2.n * 100 + d1.n * 10 + d0.n + 1 as n
    from base10 d0 cross join base10 d1 cross join base10 d2
)
select
    substring(a.Text, k.n, charindex(' ', a.Text, k.n) - k.n) as Did,
    Id, Cid, CName, Aid, AName
from TableA a inner join k
    on substring(a.Text, k.n, 4) = 'Acc.'
        and k.n < len(a.Text) /* not necessary but optimizer might use it??? */

xml节点方法可以方便地将单元格值解析成这样的行。例如:

select n.value('@s[1]', 'varchar(max)'), id, Cid, CName, Aid, AName
from Table_A ta
cross apply (select convert(xml, '<x s="' + replace(replace(replace(replace(replace(replace(ta.[Text],'&','&amp;'),'>','&gt;'),'<','&lt;'),'''','&apos;'),'"','&quot;'),' ','"/><x s="') + '"/>') xval) r
cross apply r.xval.nodes('*') x(n)
where n.value('@s[1]', 'varchar(max)') like 'Acc.%'

编辑-转义5个无效的xml字符

您是否有要查找的acc单词列表?任何有acc的单词都是我的目标单词您需要在递归CTE中使用带子字符串的PATINDEX是否对点后面的字符数有限制?或者限制每行acc匹配的数量?您的表格显示有6列,但示例数据只有4列。你能贴些清楚的东西吗?也许是小提琴?你的结果同样令人困惑。您列出了6列,但只显示了4列。正如现在发布的,这是不可能回答的。它给了我一个错误消息,比如关键字'values'附近的语法不正确。解决了这个问题。我还修复了另一个列引用。我还修复了子字符串长度上的off by one。Msg 537,级别16,状态5,第1行传递给LEFT或substring函数的无效长度参数。我对此有点困惑你有没有得到我最新版本的查询?我将k.n值改为1到1000,而不是0到999。这是该错误的一种方法。Msg 9415,16级,状态1,第3行XML解析:第1行,字符7,格式良好的检查:no'@Zack对于那些需要为XML转义的代码,这里是另一个问题的函数-
DECLARE @f TABLE (fieldName VARCHAR(255), IDField int)
INSERT INTO @f VALUES('>>>>>>1.pdf test> >b>c>xyz.pdf bob >hello world.pdf foo >womp womp.pdf>', 1)
INSERT INTO @f VALUES('>2.pdf other unnecssary stuff > bar.pdf', 2)

; WITH cte2 AS (
   SELECT 
       IDField,
       --PATINDEX('%.pdf%', fieldName) + 3 AS PDFLocation,
       --SUBSTRING(fieldName, 1, (PATINDEX('%.pdf%', fieldName) + 3)) AS PDFSubstring,
       --REVERSE(SUBSTRING(fieldName, 1, (PATINDEX('%.pdf%', fieldName) + 3))) AS PDFSubstringReverse,
       --PATINDEX('%>%', REVERSE(SUBSTRING(fieldName, 1, (PATINDEX('%.pdf%', fieldName) + 3)))) AS ReverseSymbolLocationBeforePDF,
       --LEN(SUBSTRING(fieldName, 1, (PATINDEX('%.pdf%', fieldName) + 3))) - PATINDEX('%>%', REVERSE(SUBSTRING(fieldName, 1, (PATINDEX('%.pdf%', fieldName) + 3)))) + 2 AS SymbolLocationBeforePDF,

       CONVERT(VARCHAR(255), SUBSTRING(fieldName, 
           LEN(SUBSTRING(fieldName, 1, (PATINDEX('%.pdf%', fieldName) + 3))) - PATINDEX('%>%', REVERSE(SUBSTRING(fieldName, 1, (PATINDEX('%.pdf%', fieldName) + 3)))) + 2, 
           PATINDEX('%.pdf%', fieldName) + 3 - (LEN(SUBSTRING(fieldName, 1, (PATINDEX('%.pdf%', fieldName) + 3))) - PATINDEX('%>%', REVERSE(SUBSTRING(fieldName, 1, (PATINDEX('%.pdf%', fieldName) + 3)))) + 2) + 1
       )) AS PDFName,

       CONVERT(VARCHAR(255), STUFF(fieldName, 1, PATINDEX('%.pdf%', fieldName) + 3, '')) AS strWhatsLeft
   FROM @f

   UNION ALL

   SELECT 
       IDField,
       --PATINDEX('%.pdf%', strWhatsLeft) + 3 AS PDFLocation,
       --SUBSTRING(strWhatsLeft, 1, (PATINDEX('%.pdf%', strWhatsLeft) + 3)) AS PDFSubstring,
       --REVERSE(SUBSTRING(strWhatsLeft, 1, (PATINDEX('%.pdf%', strWhatsLeft) + 3))) AS PDFSubstringReverse,
       --PATINDEX('%>%', REVERSE(SUBSTRING(strWhatsLeft, 1, (PATINDEX('%.pdf%', strWhatsLeft) + 3)))) AS ReverseSymbolLocationBeforePDF,
       --LEN(SUBSTRING(strWhatsLeft, 1, (PATINDEX('%.pdf%', strWhatsLeft) + 3))) - PATINDEX('%>%', REVERSE(SUBSTRING(strWhatsLeft, 1, (PATINDEX('%.pdf%', strWhatsLeft) + 3)))) + 2 AS SymbolLocationBeforePDF,

       CONVERT(VARCHAR(255), SUBSTRING(strWhatsLeft, 
           LEN(SUBSTRING(strWhatsLeft, 1, (PATINDEX('%.pdf%', strWhatsLeft) + 3))) - PATINDEX('%>%', REVERSE(SUBSTRING(strWhatsLeft, 1, (PATINDEX('%.pdf%', strWhatsLeft) + 3)))) + 2, 
           PATINDEX('%.pdf%', strWhatsLeft) + 3 - (LEN(SUBSTRING(strWhatsLeft, 1, (PATINDEX('%.pdf%', strWhatsLeft) + 3))) - PATINDEX('%>%', REVERSE(SUBSTRING(strWhatsLeft, 1, (PATINDEX('%.pdf%', strWhatsLeft) + 3)))) + 2) + 1
       )) AS PDFName,

       CONVERT(VARCHAR(255), STUFF(strWhatsLeft, 1, PATINDEX('%.pdf%', strWhatsLeft) + 3, '')) AS strWhatsLeft
   FROM cte2
   WHERE strWhatsLeft LIKE '%.pdf%'
)

SELECT * FROM cte2 ORDER BY IDField
select n.value('@s[1]', 'varchar(max)'), id, Cid, CName, Aid, AName
from Table_A ta
cross apply (select convert(xml, '<x s="' + replace(replace(replace(replace(replace(replace(ta.[Text],'&','&amp;'),'>','&gt;'),'<','&lt;'),'''','&apos;'),'"','&quot;'),' ','"/><x s="') + '"/>') xval) r
cross apply r.xval.nodes('*') x(n)
where n.value('@s[1]', 'varchar(max)') like 'Acc.%'