【问题标题】:How to search a string and return only numeric value?如何搜索字符串并仅返回数值?
【发布时间】:2016-12-20 19:29:35
【问题描述】:

我需要创建一个公式列。在此列中,我需要返回一个数值。

例子:

database.dbo.table1 有一个名为“message”的列,其中包含一条长消息。

消息格式如下:various words, characters, spaces <this document is> document# = 12345 <this document is>

我需要做的是搜索消息,找到“this document is”并在这两个短语之间搜索文档的数值,在公式列中返回文档#。

【问题讨论】:

  • 您似乎知道一些基于标签charindexpatindex 的功能,但您还没有尝试解决它。你真的应该包括一些你的尝试,并解释为什么它们没有奏效。
  • @bluefeet 我真的不知道这些功能。我搜索并遇到了很多,但无法弄清楚如何正确使用它们来解决我的问题。所以我什么都试过了,因为我真的不知道从哪里开始。
  • @G.Colon 您从 Microsoft 文档页面开始了解这些功能。
  • 那是 XML 吗?
  • 你能提供一个有效的样品吗?

标签: sql sql-server tsql charindex patindex


【解决方案1】:
declare @mytab table (doc xml)    
insert into @mytab values ('<SendDocument DocumentID="1234567">true</SendDocument>')

select      doc.value('(//@DocumentID)[1]','int')
from        @mytab

如果不是保存为 XML 而是保存为 VARCHAR

declare @mytab table (doc varchar(max))    
insert into @mytab values ('<SendDocument DocumentID="1234567">true</SendDocument>')

select      cast (doc as xml).value('(//@DocumentID)[1]','int')
from        @mytab

【讨论】:

  • 谢谢。这会让我开始。
【解决方案2】:

使用 SQLXML XQuery 函数/方法(例如 doc.value() 通常很昂贵,应尽可能避免使用。在这种情况下,根据提供的信息,您可以使用 CHARINDEX 获得所需的内容。

如果您正在使用 (n)varchar 字段,您可以这样做:

declare @mytab table (doc varchar(max))    
insert into @mytab values ('<SendDocument DocumentID="1234567">true</SendDocument>');

SELECT SUBSTRING(ci,1,CHARINDEX('"',ci)-1)
FROM (SELECT SUBSTRING(doc, CHARINDEX('DocumentID="',doc)+12,20) FROM @mytab) start(ci);

如果您使用的是 XML 字段,您可以这样做:

declare @mytab table (doc xml); 
insert into @mytab values ('<SendDocument DocumentID="1234567">true</SendDocument>');

SELECT SUBSTRING(ci,1,CHARINDEX('"',ci)-1)
FROM 
(
  SELECT SUBSTRING
    (
      CAST(doc AS varchar(max)), 
      CHARINDEX('DocumentID="', CAST(doc AS varchar(max)))+12,
      20
    )
  FROM @mytab
) start(ci);

【讨论】:

  • 这也让我很接近!谢谢你。我试图分解它并理解它
猜你喜欢
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 2021-01-19
  • 2021-10-22
  • 2015-12-18
  • 1970-01-01
相关资源
最近更新 更多