基本上我想要做的是我想得到中间词,使用相同字符的第二次出现(在这种情况下,破折号" - ")
这是示例输入:
declare @word nvarchar(max)
set @word = 'Technical Materials - Conversion - Team Dashboard'
这句话有三个部分,它们除以' - '虚线。
第一部分是' Technical Materials'我可以使用它:
SELECT LTRIM(RTRIM(SUBSTRING(@word, 0, CHARINDEX('-', @word, 0))))
最后一组是'团队仪表板'我可以使用它:
SELECT CASE WHEN LEN(@word) - LEN(REPLACE(@word, '-', '')) = 1
THEN NULL
ELSE
RIGHT(@word,CHARINDEX('-', REVERSE(@word))-1)
END
问题是,我很难得到中间词,即转换'在这个例子中。
答案 0 :(得分:2)
尝试此查询:
SELECT
SUBSTRING(@word,
CHARINDEX('-', @word) + 2,
CHARINDEX('-', @word, CHARINDEX('-', @word) + 1) -
CHARINDEX('-', @word) - 3)
FROM yourTable
这里的一般策略是使用SUBSTRING()
,这需要中间字符串的起始位置和结束位置。我们可以使用CHARINDEX
来查找字符串中的第一个和第二个破折号。由此,我们可以计算出我们想要的中间子串的位置。
在这里演示:
答案 1 :(得分:2)
如果格式已修复,您可以使用PARSENAME
来达到预期效果:
DECLARE @Word AS NVARCHAR(MAX) = 'Technical Materials - Conversion - Team Dashboard'
SELECT PARSENAME(REPLACE(@Word, '-', '.'), 2)
如果你想修剪额外的空格,那么:
SELECT LTRIM(RTRIM(PARSENAME(REPLACE(@Word, '-', '.'), 2)))
答案 2 :(得分:0)
这将在' - '
的前两次出现之间找到文字DECLARE @word nvarchar(max)
SET @word = 'Technical Materials - Conversion - Team Dashboard'
SELECT SUBSTRING(x, 0, charindex('-', x))
FROM (values(stuff(@word, 1, charindex('-', @word), ''))) x(x)
这将找到中间元素。在偶数个元素的情况下,它将选择2个中间元素中的第一个
DECLARE @word nvarchar(max)
SET @word = 'Technical Materials - Conversion - Team Dashboard'
;WITH CTE(txt, rn, cnt) as
(
SELECT
t.c.value('.', 'VARCHAR(2000)'),
row_number() over (order by (select 1)), count(*) over()
FROM (
SELECT x = CAST('<t>' +
REPLACE(@word, ' - ', '</t><t>') + '</t>' AS XML)
) a
CROSS APPLY x.nodes('/t') t(c)
)
SELECT txt
FROM CTE
WHERE (cnt+1) / 2 = rn