2017-05-29 50 views
2

基本上我想要做的是我想要得到中间的单词,使用第二次出现相同的字符(在这种情况下,破折号“ - ”)如何使用Substring通过Charindex的Second Position获取中间词?

这是样品输入:

declare @word nvarchar(max) 
set @word = 'Technical Materials - Conversion - Team Dashboard' 

上有这样一句话三个部分,它们除以“ - ”虚线。

第一部分是“技术资料”,这我能够用得到:

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 

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

回答

2

如果格式固定,您可以使用PARSENAME达到您的期望:

DECLARE @Word AS NVARCHAR(MAX) = 'Technical Materials - Conversion - Team Dashboard' 
SELECT PARSENAME(REPLACE(@Word, '-', '.'), 2) 

,如果要修剪多余的空格,那么:

SELECT LTRIM(RTRIM(PARSENAME(REPLACE(@Word, '-', '.'), 2))) 
+0

如果格式是固定的,你是什么意思?我的意思是这种代码不起作用的格式? –

+1

他的意思是如果你总是有2' - '而不是''。在价值 – GuidoG

+0

我的意思是这里的两个破折号。查询需要更改,如果它有少于/多于2破折号 – Arulkumar

2

尝试此查询:

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

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

演示在这里:

Rextester

+0

无效长度参数传递给LEFT或SUBSTRING函数 – GuidoG

+0

同样的,我的。传递给LEFT或SUBSTRING函数的长度参数无效。 –

+0

对不起,我把参数顺序传递给'CHARINDEX'。它现在似乎在工作。 –

0

这将找到的第2次出现之间的文本“ - ”

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