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

Posted

技术标签:

【中文标题】如何在 SQL Server 中提取此特定子字符串?【英文标题】:How to extract this specific substring in SQL Server? 【发布时间】:2012-05-03 04:43:17 【问题描述】:

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

23;chair,red [$3]

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

假设分号 ; 始终存在并且左方括号 [ 始终存在于字符串中,我如何提取(但不包括); 和 SQL Server 中的 [ 之间的文本询问?谢谢。

【问题讨论】:

值得一提的是:SQL 并不是真正的理想语言,这就是为什么一开始最好不要在 SQL 中存储这样的数据。根据它的用途,在非 sql 代码中执行此操作可能更有效。 【参考方案1】:

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

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

这假设您的字段长度永远不会超过 100,但您可以在必要时通过使用 LEN() 函数更聪明地考虑这一点。我没有打扰,因为那里已经发生了足够多的事情,而且我没有要测试的实例,所以我只是盯着括号等。

【讨论】:

CHARINDEX 使用像 CHARINDEX(';', YOUR_FIELD) 这样的单引号,而不是像 CHARINDEX(";", YOUR_FIELD) 这样的双引号。【参考方案2】:

假设它们始终存在并且不是您数据的一部分,这将起作用:

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

【讨论】:

【参考方案3】:

@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 是使用原始字符串中最后一个分隔符的位置,而不是修改后的子字符串。

【讨论】:

WHERE 子句不起作用。它认为> 0 是一个长度参数并抛出[S0003][537] Invalid length parameter passed to the LEFT or SUBSTRING function.【参考方案4】:

选择子字符串(your_field, CHARINDEX(';',your_field)+1 ,CHARINDEX('[',your_field)-CHARINDEX(';',your_field)-1) 从你的表

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

【讨论】:

这是一个更好的答案。在某些情况下,接受的答案不会返回额外的字符。谢谢!【参考方案5】:

如果您需要将某些内容拆分为 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

希望这会有所帮助。

【讨论】:

以上是关于如何在 SQL Server 中提取此特定子字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写此查询以在 Sql Server 中获得更好的性能?删除子字符串行

SQL Server:提取特定字符串,然后加入两个表

SQL Server中如何将特定形式字符串转换为时间格式。并将该时间进行加减

SQL Server实现将特定字符串拆分并进行插入操作的方法

如何使用正则表达式将特定子字符串提取到新行中?

如何从 C++ 中的 getline 函数中提取特定的子字符串?