美好的一天
我有问题我无法修复查询以选择字符串的中间拍。
我的表格有1000多行和字符串,如:
x0gdfg992|x05gjy652|t0kk2:-
我需要选择部分:x05gjy652
感谢您的意见
我无法更改输入数据。
答案 0 :(得分:1)
试试这个
DECLARE @String nvarchar(100)
SET @String='x0gdfg992|x05gjy652|t0kk2'
SELECT SUBSTRING(String,0,CHARINDEX('|',String)) AS RequiredPart
FROM
(
SELECT SUBSTRING(@String,CHARINDEX('|',@String)+1,LEN(@String)) AS String
)dt
结果,演示:http://rextester.com/OSSUS74768
RequiredPart
--------------
x05gjy652
答案 1 :(得分:1)
一个班轮:
declare @s nvarchar(100)
SET @s = N'x0gdfg992|x05gjy652|t0kk2:-'
SELECT SUBSTRING(@s, CHARINDEX('|',@s)+1, (CHARINDEX('|',@s,(CHARINDEX('|',@s)+1)))-CHARINDEX('|',@s) -1 )
CHARINDEX('|',@s)+1
...找到第一个|
(CHARINDEX('|',@s,(CHARINDEX('|',@s)+1)))-CHARINDEX('|',@s) -1
...计算首字母|
和第二|
之间字符串所需的字符串长度。详细说明可能令人困惑的第二项:
(CHARINDEX('|',@s,(CHARINDEX('|',@s)+1)))
...在第一个|
之后搜索|
(起点为(CHARINDEX('|',@s)+1)
)
CHARINDEX('|',@s)
...第一个|
-1
...将排除最后一个|
。
答案 2 :(得分:0)
Peronsally,我会使用一个String Splitter来给出Ordinal Position;例如Jeff Moden的DelimitedSplit8K。
然后变得微不足道:
SELECT DS.Item
FROM YourTable YT
CROSS APPLY DelimitedSplit8K(YT.YourString, '|') DS
WHERE DS.ItemNumber = 2;
答案 3 :(得分:0)
另一种选择是通过一点XML
示例强>
Select NewValue=cast('<x>' + replace(SomeCol,'|','</x><x>')+'</x>' as xml).value('/x[2]','varchar(max)')
From YourTable
<强>返回强>
NewValue
x05gjy652
答案 4 :(得分:0)
DECLARE @A VARCHAR(200)='x0gdfg992|x05gjy652|t0kk2',
@B VARCHAR(500)
SELECT @B=SUBSTRING(@A,CHARINDEX('|',@A,1)+1,LEN(@A))
SELECT
SUBSTRING((SUBSTRING(@A,CHARINDEX('|',@A,1)+1,LEN(@A))),1,CHARINDEX('|',
(SUBSTRING(@A,CHARINDEX('|',@A,1)+1,LEN(@A))),1)-1)