【问题标题】:Extracting text between two characters in SQL在SQL中提取两个字符之间的文本
【发布时间】:2014-03-26 17:16:17
【问题描述】:

我正在尝试使用 t-sql 提取两个字符之间的文本。我已经能够将它写在它使信息接近我想要的地方,但由于某种原因,我没有得到我所期望的(惊喜,惊喜)。真的可以用一点帮助来完善它。我正在尝试提取位于两个 [] 之间的部分表名。列数据的示例如下(这是一个记录对数据库所做的所有更改的表,因此列文本基本上是 SQL 语句):

ALTER TABLE [TABLENAME].[MYTABLE] ADD
[VIP_CUSTOMER] [int] NULL

我试图提取表名的一部分,在这个例子中我只想要'MYTABLE'

我现在正在使用:

select  SUBSTRING(db.Event_Text, CHARINDEX('.', db.Event_Text) + 2, (CHARINDEX(']', db.Event_Text)) - CHARINDEX('', db.Event_Text) + Len(']')) as OBJName
FROM DBA_AUDIT_EVENT DB
WHERE DATABASE_NAME = 'XYZ'

但是当我使用它时,我并不总是得到所需的结果。有时我得到'MYTABLE] ADD',有时我得到我想要的名字的一部分,有时根据表名的长度,我只得到名字的第一部分,名字的一部分在最后被切断。无论如何要做到这一点,还是有更好的写法?任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 我看到的一个问题是 CHARINDEX('', db.Event_Text) 每次都会返回零。我假设这不是你想要的。
  • 捕获这些事件时可以添加这些内容吗?

标签: sql tsql


【解决方案1】:

很长,但这里有一个使用括号的公式:

Declare @text varchar(200);
Select @text='ALTER TABLE [TABLENAME].[MYTABLE] ADD [VIP_CUSTOMER] [int] NULL';
Select SUBSTRING(@text, 
                 CHARINDEX('[', @text, CHARINDEX('[', @text) + 1 ) +1, 
                 CHARINDEX(']', @text, CHARINDEX('[', @text, CHARINDEX('[', @text) + 1 ) ) -
                    CHARINDEX('[', @text, CHARINDEX('[', @text) + 1 ) - 1 );

将@text 替换为您的列名。

【讨论】:

  • 谢谢托尼,这个答案非常有效。感谢您的快速响应。
【解决方案2】:

试一试:

select SUBSTRING(db.Event_Text, CHARINDEX('.', db.Event_Text) + 2
, CHARINDEX(']', db.Event_Text) - 2) as OBJName
FROM DBA_AUDIT_EVENT DB
WHERE DATABASE_NAME = 'XYZ'

【讨论】:

  • 这基本上和我的陈述造成了同样的问题。仍然提供不完整的名称或超出需要的名称。
【解决方案3】:

这是获取长度的一种非常丑陋的方法,但我以前使用过类似的方法:

select  SUBSTRING(db.Event_Text, 
    CHARINDEX('.', db.Event_Text) + 2,  
    charindex('] ADD',db.Event_Text) - CHARINDEX('.',db.Event_Text)-2))

试一试,它可能对你有用。

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 2018-11-02
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2016-08-13
    • 2013-05-14
    相关资源
    最近更新 更多