我有一个包含这样的列
Term
-------
Semester Genap 2016/2017
Semester Ganjil 2016/2017
我想要
Term
-------
Semester Genap
Semester Ganjil
如何使用SUBSTRING做到这一点?
答案 0 :(得分:2)
还有一种方法,通过XML使用 string-split 方法:
DECLARE @tbl TABLE(ID INT IDENTITY,Term VARCHAR(100));
INSERT INTO @tbl VALUES
('Semester Genap 2016/2017')
,('Semester Ganjil 2016/2017');
WITH Casted AS (
SELECT ID
,CAST('<x>' + REPLACE((SELECT Term AS [*] FOR XML PATH('')),' ','</x><x>') + '</x>' AS XML) AS TheXML
FROM @tbl
)
SELECT ID
,TheXML.value(N'(x/text())[1]','nvarchar(max)') AS Part1
,TheXML.value(N'(x/text())[2]','nvarchar(max)') AS Part2
,TheXML.value(N'(x/text())[3]','nvarchar(max)') AS Part3
FROM Casted;
结果
ID Part1 Part2 Part3
1 Semester Genap 2016/2017
2 Semester Ganjil 2016/2017
答案 1 :(得分:0)
假设你总是想要一个日期左边的所有内容,并且日期以&#34; 2&#34;开头,那么这将起作用(可怕,但有效):
只需用您的列替换变量(仅用于测试):
declare @String varchar(50) = 'Semester Genap 2016/2017'
select SUBSTRING(@String,0,len(@String)-(len(@String)-CHARINDEX('2',@String,0))-1)
产地: &#39; Semester Genap&#39;
答案 2 :(得分:0)
您可以使用charindex
查找空格,并使用它来获取前2个单词:
declare @t nvarchar(50);
set @t = 'Semester Genap 2016/2017';
select @t, CHARINDEX(' ', @t), SUBSTRING(@t, 0, charindex(' ', @t, charindex(' ',@t) + 1))
答案 3 :(得分:0)
SUBSTRING(@statement,0,CHARINDEX(@statement,' ',CHARINDEX(@statement,' ')+1))
的某些内容。我现在没有办法测试它,但它应该让你朝着正确的方向前进。
CHARINDEX(@statement,' ')
- 从找到第一个空格开始(这结束第一个单词CHARINDEX(@statement,' ',CHARINDEX(@statement,' ')+1)
- 接着找到下一个空格,或者更确切地说是从第一个空格后面开始找到第一个空格(这标志着第二个单词的结尾)SUBSTRING(@statement,0,CHARINDEX(@statement,' ',CHARINDEX(@statement,' ')+1))
- 获取从右开始到第二个空格的子字符串。答案 4 :(得分:0)
问题的另一个变种。
SELECT SUBSTRING('Semester Genap 2016/2017',1,LEN('Semester Genap 2016/2017') - CHARINDEX(' ',REVERSE('Semester Genap 2016/2017')))
答案 5 :(得分:0)
如果您的字词可能包含199x/199x
等旧数据,那么您可以使用PATINDEX
查找字符串中的第一个数字。
DECLARE @Term varchar(max) = 'Semester Genap 2016/2017'
SELECT RTRIM(SUBSTRING(@Term, 1, PATINDEX('%[0-9]%', @Term +'0') - 1))