我有一个具有特定模式的字符串:
23;chair,red [$3]
即,一个数字后跟一个分号,然后是一个名字,后跟一个左方括号。
假设分号;
始终存在且左方括号[
始终存在于字符串中,如何在;
和[
之间提取文本(不包括) {1}}在SQL Server查询中?感谢。
答案 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。希望这可以帮助!