我非常擅长SQL,但我有一段时间没有这样做。
我有一个带有常见字符串的简单表:
TableName = ExampleTable1
ColumnName = ExampleColumn1
我有一个这样的字符串:
MYSTRING_10_TB_EXAMPLE1
MYSTRING_120_TB_EXAMPLE2
我有这个问题:
select ExampleColumn1, replace(ExampleColumn1,'MYSTRING_', '') from ExampleTable1
这只返回字符串开头的数字:
"10_TB_EXAMPLE1"
我现在需要在整数后的第一个破折号后删除字符串。整数可以是一个数字,也可以是四个或五个,但我需要删除第一个“_”或以“_TB”开头的任何内容,只返回整数。
我知道你可以使用STUFF并替换。我想我需要在''与另一个替换的查询中替换我的第三个参数或者可能正确吗?
我在这里尝试过很多东西,我不能在第一个“_”符号后修剪整个字符串,只留下整数。
答案 0 :(得分:1)
使用while()
功能。
这个查询:
SUBSTRING_INDEX()
将返回SELECT SUBSTRING_INDEX(
SUBSTRING_INDEX('MYSTRING_120_TB_EXAMPLE2','_',2),
'_', -1);
答案 1 :(得分:0)
您可以将字符串拆分为其部分,并继续您想要的任何内容。试试这样:
DECLARE @tbl TABLE(aString VARCHAR(100));
INSERT INTO @tbl VALUES('MYSTRING_10_TB_EXAMPLE1')
,('MYSTRING_120_TB_EXAMPLE2');
WITH Splitted AS
(
SELECT CAST('<x>' + REPLACE(aString,'_','</x><x>') + '</x>' AS XML) AS SingleWords
FROM @tbl
)
SELECT SingleWords.value('x[1]','varchar(max)') AS part1
,SingleWords.value('x[2]','int') AS part2
,SingleWords.value('x[3]','varchar(max)') AS part3
,SingleWords.value('x[4]','varchar(max)') AS part4
FROM Splitted
/* Result
part1 part2 part3 part4
MYSTRING 10 TB EXAMPLE1
MYSTRING 120 TB EXAMPLE2
*/
只是一个简短的解释:下划线被"</x><x>"
取代。开头为"<x>"
,结尾为"</x>"
,这是XML。每个节点都可以通过索引进行寻址。就是这样......
答案 2 :(得分:0)
使用REPLACE
剪掉字符串的第一部分,就像您已经完成的那样。
使用CHARINDEX
查找(在结果字符串中)第一个_
的位置
然后使用LEFT
仅保留字符串的左侧部分(但不包括)第一个_
SELECT
ExampleColumn1,
LEFT( REPLACE(ExampleColumn1,'MYSTRING_', ''),
CHARINDEX( REPLACE(ExampleColumn1,'MYSTRING_', ''), '_' ) - 1
)
FROM
ExampleTable1
会返回
MYSTRING_10_TB_EXAMPLE1 10
MYSTRING_120_TB_EXAMPLE2 120
如果您使用mySql而非CHARINDEX
使用LOCATE
:
LOCATE( '_', REPLACE(ExampleColumn1,'MYSTRING_', '') ) - 1