选择字符串MSSQL的中间部分

时间:2018-05-16 09:22:35

标签: sql sql-server database sql-server-2008

美好的一天

我有问题我无法修复查询以选择字符串的中间拍。

我的表格有1000多行和字符串,如:

x0gdfg992|x05gjy652|t0kk2:-

我需要选择部分:x05gjy652

感谢您的意见

我无法更改输入数据。

5 个答案:

答案 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 )
  1. CHARINDEX('|',@s)+1 ...找到第一个|
  2. 的位置
  3. (CHARINDEX('|',@s,(CHARINDEX('|',@s)+1)))-CHARINDEX('|',@s) -1 ...计算首字母|和第二|之间字符串所需的字符串长度。
  4. 详细说明可能令人困惑的第二项:

    1. (CHARINDEX('|',@s,(CHARINDEX('|',@s)+1))) ...在第一个|之后搜索|(起点为(CHARINDEX('|',@s)+1)

    2. CHARINDEX('|',@s) ...第一个|

    3. 的位置
    4. -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)