从SQL Server

时间:2015-08-21 08:59:16

标签: sql-server

我的一个表中有一个varchar column,我需要能够从中间隔离一些文本,以便我可以使用它来查找另一个表中的信息。

此列可能包含的文本示例如下:

0A10-Deeside PKG AHU-G37-Pa-A is out of range (Current value of 12.000000 is greater than the maximum value of 5.000000)

在此示例中,0A10-Deeside是我们在同一个表中另一列中的数据,称为AssetID,可以是任意长度。同样,“超出范围”的文本可以是任意长度,但始终以字符串“超出范围”开头。

我需要隔离资产ID和“超出范围”之间的文本(PKG AHU-G37-Pa-A),但我正在努力找到一种方法,因为这也会有不同的长度,所以使用单独的SubString是不可能的。

有什么方法吗?我正在使用MS SQL Server 2008

3 个答案:

答案 0 :(得分:1)

使用char index查找第一个空格和is的位置。将这些反馈回子字符串。 https://msdn.microsoft.com/en-us/library/ms186323.aspx

SELECT SubString(theText,0, FirstSpace),....
FROM (
    SELECT CHARINDEX(" ",theText) firstSpace, CHARINDEX(" is",theText) LastSpace, theText
) AS T

答案 1 :(得分:0)

我喜欢XML类型,因为你可以用它做所有有趣的事情。也许这种方法适合你,因为它绝对可变......

DECLARE @test VARCHAR(MAX)='0A10-Deeside PKG AHU-G37-Pa-A is out of range (Current value of 12.000000 is greater than the maximum value of 5.000000)';

DECLARE @testXML XML=CAST('<root><r>' + REPLACE(@test,'is out of range','</r><r>') + '</r></root>' AS XML);

SELECT x.y.value('.','varchar(max)')
FROM @testXML.nodes('/root/r') AS x(y);

从表中选择这一点的一些增强功能,其中开头是另一列的一部分:

DECLARE @tbl TABLE(testText VARCHAR(MAX),AnotherColumn VARCHAR(MAX));

INSERT INTO @tbl VALUES('0A10-Deeside PKG AHU-G37-Pa-A is out of range (Current value of 12.000000 is greater than the maximum value of 5.000000)','0A10-Deeside');

SELECT testXML.v.value('/root[1]/r[2]','varchar(max)')
FROM @tbl AS tbl
CROSS APPLY
(
    SELECT CAST('<root><r>' + REPLACE(REPLACE(tbl.testText,'is out of range','</r><r>'),tbl.AnotherColumn,'</r><r>') + '</r></root>' AS XML) 
) AS testXML(v)

答案 2 :(得分:0)

此查询将隔离col2与文本超出范围之间的文字:

SELECT 
  stuff(substring(col1, 0, charindex(' is out of range', col1)), 1,
    len(col2) + 1, '')
FROM yourtable

结果:

PKG AHU-G37-Pa-A