如何通过第二位的Charindex使用Substring获得中间单词?

时间:2017-05-29 12:27:24

标签: sql sql-server

基本上我想要做的是我想得到中间词,使用相同字符的第二次出现(在这种情况下,破折号" - ")

这是示例输入:

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

问题是,我很难得到中间词,即转换'在这个例子中。

3 个答案:

答案 0 :(得分:2)

尝试此查询:

SELECT
    SUBSTRING(@word,
              CHARINDEX('-', @word) + 2,
              CHARINDEX('-', @word, CHARINDEX('-', @word) + 1) -
                  CHARINDEX('-', @word) - 3)
FROM yourTable

这里的一般策略是使用SUBSTRING(),这需要中间字符串的起始位置和结束位置。我们可以使用CHARINDEX来查找字符串中的第一个和第二个破折号。由此,我们可以计算出我们想要的中间子串的位置。

在这里演示:

Rextester

答案 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