【发布时间】:2018-05-16 09:22:34
【问题描述】:
美好的一天
我有问题我无法修复查询以选择字符串的中间部分。
我的表格有 1000 多行和字符串,例如:
x0gdfg992|x05gjy652|t0kk2:-
我需要选择部分:x05gjy652
感谢您的意见
我无法更改输入数据。
【问题讨论】:
-
固定位置,还是可变位置?
标签: sql sql-server database sql-server-2008
美好的一天
我有问题我无法修复查询以选择字符串的中间部分。
我的表格有 1000 多行和字符串,例如:
x0gdfg992|x05gjy652|t0kk2:-
我需要选择部分:x05gjy652
感谢您的意见
我无法更改输入数据。
【问题讨论】:
标签: sql sql-server database sql-server-2008
试试这个
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
【讨论】:
一个班轮:
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 ... 是排除最后一个|。
【讨论】:
就个人而言,我会使用一个字符串拆分器,它给出序数位置;例如 Jeff Moden 的DelimitedSplit8K。
然后这变得微不足道:
SELECT DS.Item
FROM YourTable YT
CROSS APPLY DelimitedSplit8K(YT.YourString, '|') DS
WHERE DS.ItemNumber = 2;
【讨论】:
另一个选择是通过一点 XML
示例
Select NewValue=cast('<x>' + replace(SomeCol,'|','</x><x>')+'</x>' as xml).value('/x[2]','varchar(max)')
From YourTable
退货
NewValue
x05gjy652
【讨论】:
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)
【讨论】: