替换或修剪SQL中的字符串

替换或修剪SQL中的字符串,sql,string,Sql,String,我非常擅长SQL,但我已经有一段时间没这么做了 我有一个带有公共字符串的简单表: TableName = ExampleTable1 ColumnName = ExampleColumn1 我有这样一个字符串: MYSTRING_10_TB_EXAMPLE1 MYSTRING_120_TB_EXAMPLE2 DECLARE @tbl TABLE(aString VARCHAR(100)); INSERT INTO @tbl VALUES('MYSTRING_10_TB_EXAMPLE1')

我非常擅长SQL,但我已经有一段时间没这么做了

我有一个带有公共字符串的简单表:

TableName = ExampleTable1
ColumnName = ExampleColumn1
我有这样一个字符串:

MYSTRING_10_TB_EXAMPLE1
MYSTRING_120_TB_EXAMPLE2
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
*/
我有一个疑问:

select ExampleColumn1, replace(ExampleColumn1,'MYSTRING_', '') from ExampleTable1
SELECT SUBSTRING_INDEX(
  SUBSTRING_INDEX('MYSTRING_120_TB_EXAMPLE2','_',2),
  '_', -1);
这只返回字符串开头的数字:

"10_TB_EXAMPLE1"
我现在需要删除整数后面第一个破折号后面的字符串。整数可以是一位数字,也可以是四位或五位数字,但我需要所有内容,包括第一个u-remove或任何以_-TB开头的内容,以便只返回整数

我知道你可以用东西来替换。我想我需要用另一个替换替换查询中的第三个参数,或者是对的


我在这里尝试了很多方法,但我不能在第一个符号后修剪整个字符串,只留下整数。

您可以将字符串拆分为多个部分,然后继续执行您想要的任何操作。试着这样做:

MYSTRING_10_TB_EXAMPLE1
MYSTRING_120_TB_EXAMPLE2
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
*/
只是一个简短的解释:下划线替换为。开头是开始,结尾是结束,这就是XML。每个节点都可以通过其索引寻址。就是这样…

使用子字符串索引函数。 此查询:

select ExampleColumn1, replace(ExampleColumn1,'MYSTRING_', '') from ExampleTable1
SELECT SUBSTRING_INDEX(
  SUBSTRING_INDEX('MYSTRING_120_TB_EXAMPLE2','_',2),
  '_', -1);
将返回120

使用REPLACE修剪字符串的第一部分,就像您已经做的那样

使用CHARINDEX在结果字符串中查找第一个字符串的位置_

然后使用LEFT仅保留字符串的左侧部分,但不包括第一部分_

会回来吗

MYSTRING_10_TB_EXAMPLE1      10
MYSTRING_120_TB_EXAMPLE2     120
如果您使用的是mySql而不是CHARINDEX,请使用LOCATE:


看看子字符串函数。顺便说一句,请使用标记来格式化您的问题,例如将代码放入代码标记中等,以使其更具可读性。Chris,正如您所见,陈述RDBMS非常重要。一个是MySQL,另一个是SQL Server。请编辑您的问题并说明正确的标签,谢谢!嗨,很抱歉。子字符串不是一定数量的字符吗?那么您使用的是哪种DBMS?博士后?甲骨文?嗨,克里斯,因为你是新来的,所以,请注意,在这里给出答案的专业人士渴望获得声誉积分。请仔细阅读答案,如果有帮助,请投票表决。如果其中一个帮助您解决了问题,您应该将其标记为已接受的答案,谢谢!据我所知,MySQL中没有STUFF函数。当OP提到这个函数时,我想问题在于SQL Server。。。这是为了让OP澄清。。。