通过某个软件包的前端,管理员可以在自由文本字段(称为“注释”)中为系统中的每个用户添加标记。
[teamlead:tom] [diet:vegan] [location:munich]
我知道如果我们可以简单地向Users表添加列以向用户添加元数据会更好,但我们没有这种可能性。
我现在需要查询这个自由文本字段,基本上查询:
select userid, username, diet from Users where diet is not null;
为此,我必须解析评论中的文字,但我不确定最佳方法是什么。
我可以在查询中实时解析(表只有几百个用户,所以性能不应该是一个问题)?
这样的事情需要两个步骤吗?例如,首先构建一个包含所有值的临时表?如果是这样,我如何解析注释并为每个用户的所有标记构建临时表?
答案 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