我有一个具有特定模式的字符串:
23;chair,red [$3]
即,一个数字后跟一个分号,然后一个名称后跟一个左方括号。
假设分号;
始终存在并且左方括号[
始终存在于字符串中,如何在 SQL Server 查询中提取(但不包括)the;
和 the之间的文本?[
谢谢。
我有一个具有特定模式的字符串:
23;chair,red [$3]
即,一个数字后跟一个分号,然后一个名称后跟一个左方括号。
假设分号;
始终存在并且左方括号[
始终存在于字符串中,如何在 SQL Server 查询中提取(但不包括)the;
和 the之间的文本?[
谢谢。
组合SUBSTRING()
、LEFT()
和CHARINDEX()
函数。
SELECT LEFT(SUBSTRING(YOUR_FIELD,
CHARINDEX(';', YOUR_FIELD) + 1, 100),
CHARINDEX('[', YOUR_FIELD) - 1)
FROM YOUR_TABLE;
这假设您的字段长度永远不会超过 100,但如果需要,您可以通过使用该LEN()
函数更聪明地考虑这一点。我没有打扰,因为那里已经发生了足够多的事情,而且我没有要测试的实例,所以我只是盯着括号等。
假设它们始终存在并且不是您的数据的一部分,这将起作用:
declare @string varchar(8000) = '23;chair,red [$3]'
select substring(@string, charindex(';', @string) + 1, charindex(' [', @string) - charindex(';', @string) - 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 是使用原始字符串中最后一个分隔符的位置,而不是修改后的子字符串。
select substring(your_field, CHARINDEX(';',your_field)+1 ,CHARINDEX('[',your_field)-CHARINDEX(';',your_field)-1) from your_table
不能让其他人工作。我相信你只想要';'之间的东西 和 '[' 在所有情况下,无论中间的字符串有多长。在 substring 函数中指定字段后,第二个参数是您将提取的内容的起始位置。也就是说,';' 是 + 1(第四位 - c),因为您不想包含“;”。下一个参数获取 '[' 的位置(位置 14)并减去 ';' 之后的位置 (第四位 - 这就是我现在在查询中减去 1 的原因)。这基本上是说子字符串(字段,我想要子字符串开始的位置,我想要子字符串多长时间)。我在其他情况下也使用过同样的功能。如果某些字段没有';' 和你' 我想在“where”子句中过滤掉那些,但这与问题有点不同。如果你的 ';' 有人说...';;;',您将在示例中使用 3 而不是 1。希望这可以帮助!
如果您需要将某些内容分成 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
希望这可以帮助。