我的一个表中有一个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
答案 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