我有一个表,其前缀可变长度始终以.
结尾,后缀可变长度始终以-
开头。 -
也可以在我要查找的文本字符串中找到,因此使用REVERSE()可能是识别后缀-
的最佳方式。
ex:Prefix1.ABC-123-Suffix1
我希望SUBSTRING()结果如下:ABC-123
我能够同时创建SUBSTRING()
以删除前缀,并创建SUBSTRING()
以删除后缀,但我很难同时应用这两种情况。返回的文本可以是可变长度。
我试图避免声明一个变量,但我对此持开放态度。如果可能的话,我更喜欢只使用SUBSTRING(),REVERSE()和CHARINDEX()。
这是我到目前为止所做的:
SELECT [Col1]
,SUBSTRING((Col1),CHARINDEX('.', (Col1)) + 1, 999) AS [StrippedPrefix]
,REVERSE(SUBSTRING(REVERSE(Col1),CHARINDEX('-', REVERSE(Col1)) + 1, 999)) AS [StrippedSuffix]
--new SUBSTRING() with both Prefix and Suffix stripped
FROM [Table1]
答案 0 :(得分:2)
Declare @YourTable table (Col1 varchar(50))
Insert Into @YourTable values
('Prefix1.ABC-123-Suffix1')
Select *
,String=Substring(Col1,charindex('.',Col1)+1,len(Col1)-charindex('.',Col1)-charindex('-',reverse(Col1)))
From @YourTable
返回
Col1 String
Prefix1.ABC-123-Suffix1 ABC-123
根据M Ali的建议(更好)
Select *
,String=PARSENAME(REPLACE(Col1 , '-', '.') , 3) + '-' + PARSENAME(REPLACE(Col1 , '-', '.') , 2)
From @YourTable
答案 1 :(得分:0)
这里varaiable仅用作演示 - 也应该与你的桌子一起使用:
DECLARE @s nvarchar(100) = 'Prefix1.ABC-123-Suffix1'
SELECT @s,
SUBSTRING(@s, 1, CHARINDEX('.', @s)-1) StrippedPrefix,
SUBSTRING(@s, LEN(@s)-CHARINDEX('-', REVERSE(@s))+2, CHARINDEX('-', REVERSE(@s))) StrippedSuffix,
SUBSTRING(@s, CHARINDEX('.', @s)+1, LEN(@s)-CHARINDEX('.', @s)-CHARINDEX('-', REVERSE(@s))) NewString
答案 2 :(得分:0)
这是一种方式
DECLARE @str VARCHAR(100)= 'Prefix1.ABC-123-Suffix'
SELECT Reverse(Stuff(intr_str, 1, Charindex('-', intr_str), ''))
FROM (SELECT Reverse(Stuff(@str, 1, Charindex('.', @str), '')) AS intr_str) a
结果: ABC-123