解析注释并将其保存在临时表中

时间:2016-03-10 12:53:13

标签: sql sql-server parsing

通过某个软件包的前端,管理员可以在自由文本字段(称为“注释”)中为系统中的每个用户添加标记。

[teamlead:tom] [diet:vegan] [location:munich]

我知道如果我们可以简单地向Users表添加列以向用户添加元数据会更好,但我们没有这种可能性。

我现在需要查询这个自由文本字段,基本上查询:

select userid, username, diet from Users where diet is not null;

为此,我必须解析评论中的文字,但我不确定最佳方法是什么。

我可以在查询中实时解析(表只有几百个用户,所以性能不应该是一个问题)?

这样的事情需要两个步骤吗?例如,首先构建一个包含所有值的临时表?如果是这样,我如何解析注释并为每个用户的所有标记构建临时表?

2 个答案:

答案 0 :(得分:1)

首先,对于您的示例查询,您实际上不必解析注释。您可以使用like查找关键字:

where comments like '%![diet:%' escape '!'

纯素饮食:

where comments like '%![diet:vegan!]%' escape '!'

当然,实际上解析评论是可取的。最简单的方法是在网络上查找split()功能(Google:“SQL Server拆分”)。然后,您可以使用它来分割值。您可能还会找到将这些字符串转换为XML的方法,这将是另一种方法。

答案 1 :(得分:0)

放手一搏。

IF OBJECT_ID('tempdb..#Output') IS NOT NULL
    DROP TABLE #Output

CREATE TABLE #Output
    (UserID INT IDENTITY(1, 1),
     username NVARCHAR(MAX),
     diet NVARCHAR(MAX))

INSERT INTO #Output
SELECT REPLACE(REPLACE(SUBSTRING(Comments, CHARINDEX('[teamlead:', Comments, 1), CHARINDEX(']', Comments)), '[teamlead:', ''), ']', ''),
       REPLACE(REPLACE(SUBSTRING(Comments, CHARINDEX('[diet:', Comments, 1), CHARINDEX(']', Comments, 20) - LEN(SUBSTRING(Comments, CHARINDEX('[teamlead:', Comments, 1), CHARINDEX(']', Comments)))), '[diet:', ''), ']', '')
FROM Users