如何在SQL Server中提取此特定子字符串?

时间:2012-04-22 06:48:52

标签: sql-server substring

我有一个具有特定模式的字符串:

23;chair,red [$3]

即,一个数字后跟一个分号,然后是一个名字,后跟一个左方括号。

假设分号;始终存在且左方括号[始终存在于字符串中,如何在;[之间提取文本(不包括) {1}}在SQL Server查询中?感谢。

5 个答案:

答案 0 :(得分:20)

合并SUBSTRING()LEFT()CHARINDEX()函数。

SELECT LEFT(SUBSTRING(YOUR_FIELD,
                      CHARINDEX(';', YOUR_FIELD) + 1, 100),
                      CHARINDEX('[', YOUR_FIELD) - 1)
FROM YOUR_TABLE;

这假设您的字段长度永远不会超过100,但是如果需要,您可以通过使用LEN()函数使其变得更聪明。我没有打扰,因为那里已经有足够的事情了,而且我没有一个实例可以测试,所以我只是看着我的括号等等。

答案 1 :(得分:5)

假设它们始终存在且不属于您的数据,这将起作用:

declare @string varchar(8000) = '23;chair,red [$3]'
select substring(@string, charindex(';', @string) + 1, charindex(' [', @string) - charindex(';', @string) - 1)

答案 2 :(得分:1)

@Marc

提供的答案的替代方案
SELECT SUBSTRING(LEFT(YOUR_FIELD, CHARINDEX('[', YOUR_FIELD) - 1), CHARINDEX(';', YOUR_FIELD) + 1, 100)
FROM YOUR_TABLE
WHERE CHARINDEX('[', YOUR_FIELD) > 0 AND
    CHARINDEX(';', YOUR_FIELD) > 0;

这确保了分隔符的存在,并解决了当前接受的答案的问题,其中最后执行LEFT是使用原始字符串中最后一个分隔符的位置,而不是修改后的子字符串。

答案 3 :(得分:0)

如果您需要将某些内容拆分成3个部分,例如电子邮件地址而您不知道中间部分的长度,请尝试这个(我只是在sqlserver 2012上运行它,所以我知道它有效):

SELECT top 2000 
    emailaddr_ as email,
    SUBSTRING(emailaddr_, 1,CHARINDEX('@',emailaddr_) -1) as username,
    SUBSTRING(emailaddr_, CHARINDEX('@',emailaddr_)+1, (LEN(emailaddr_) - charindex('@',emailaddr_) - charindex('.',reverse(emailaddr_)) ))  domain 
FROM 
    emailTable
WHERE 
    charindex('@',emailaddr_)>0 
    AND 
    charindex('.',emailaddr_)>0;
GO

希望这有帮助。

答案 4 :(得分:0)

选择子字符串(your_field,CHARINDEX(';',your_field)+1 ,CHARINDEX( '[',your_field)-CHARINDEX( ';',your_field)-1) 来自your_table

无法让其他人工作。我相信你只想要''之间的东西。并且'['在所有情况下都不管它们之间的字符串有多长。在子字符串函数中指定字段后,第二个参数是要提取的内容的起始位置。也就是说,';'是+ 1(第四个位置 - c),因为你不想包含';'。下一个参数采用'['(位置14)的位置,并在';'之后减去该位置的位置。 (第四个位置 - 这就是我现在在查询中减去1的原因)。这基本上说是子字符串(字段,位置我希望子字符串开始,我想要子字符串多长时间)。我在其他情况下使用过相同的功能。如果某些字段没有';'和'[',你会想要在“where”子句中过滤掉那些,但这与问题有点不同。如果你的 ';'当然说...';;;',你会在例子中用3而不是1。希望这可以帮助!