【发布时间】:2018-03-08 19:30:44
【问题描述】:
我在 SQL 中有一个 VARCHAR(MAX) 字符串字段,在某些情况下,它在 LEN 中最多包含 100k 个字符。让我们称之为 [Notes_Comments]。
[Notes_Comments] 字段的内容是注释和 cmets,在某些情况下,这些注释和 cmets 会被多次复制/粘贴。没有关于新旧部分开始/结束的描述。标点符号也是命中注定的。
我想弄清楚如何在 [Notes_Comments] 字段中识别唯一的句子或字符串/子字符串,以从本质上获得纯粹的、去重的内容视图。
我构建了一个 SplitString 函数,并且能够开始解析 2,3 和 5 个单词的短语,但它并没有真正让我到达我需要得到完整句子的地方。
示例 [Notes_Comments]:
我想要这个
上午 10:46 与 blah 谈论 blah 上午 11:46 他们说他们不知道我的意思 下午 12:46 构建了一个 SplitString 函数并将单词解析为带有单词索引的表格 下午 1:46 进展顺利识别单词但不是完整的字符串 2:46 PM 删除干扰词 3:46 PM 删除已知类别的单词 4:46 PM 试图弄清楚如何删除一个字符串字段的重复部分。笔记 一些重复的东西。现在添加了一些新的东西。注释 增加了一点。必须对出现多次的文本部分进行重复数据删除。备注 再来一节。
从这里
上午 10:46 与 blah 谈论 blah 上午 11:46 他们说他们不知道我的意思 下午 12:46 构建了一个 SplitString 函数并将单词解析为带有单词索引的表格 下午 1:46 进展顺利识别单词但不是完整的字符串 2:46 PM 删除干扰词 3:46 PM 删除已知类别的单词 注释 一些重复的东西 10:46 AM 与 blah 谈论 blah 11:46 AM 他们说他们不知道我的意思 12:46 PM 构建了一个 SplitString 函数并将单词解析成一个带有单词索引的表 1:46 PM 识别单词但不是完整字符串的良好进展 2:46 PM 删除噪声词 3:46 PM 删除已知类别的单词下午 4:46 试图弄清楚如何删除一个字符串字段的重复部分。笔记 一些重复的东西。现在添加了一些新的东西。注释 增加了一点。必须对出现多次的文本部分进行重复数据删除。 上午 10:46 与 blah 谈论 blah 上午 11:46 他们说他们不知道我的意思 下午 12:46 构建了一个 SplitString 函数并将单词解析为带有单词索引的表格 1:46 PM 识别单词但不是完整字符串的良好进展 2:46 PM 去除噪音单词 3:46 PM 去除已知类别的单词 4:46 PM 试图弄清楚如何去除重复部分一个字符串字段。笔记 一些重复的东西。现在添加了一些新的东西。注释 增加了一点。必须对出现多次的文本部分进行重复数据删除。 Notes 还有一节。
这是我的 SplitString 函数:
CREATE FUNCTION dbo.SplitString
(
@str NVARCHAR(max),
@separator CHAR(1)
)
RETURNS TABLE
AS
RETURN (
WITH tokens(p, a, b) AS (
SELECT
CAST(1 AS bigint),
CAST(1 AS bigint),
CHARINDEX(@separator, @str)
UNION all
SELECT
p + 1,
b + 1,
CHARINDEX(@separator, @str, b + 1)
FROM tokens
WHERE b > 0
)
SELECT
p-1 ItemIndex,
SUBSTRING(
@str,
a,
CASE WHEN b > 0 THEN b-a ELSE LEN(@str) END)
AS word
FROM tokens
);
GO
【问题讨论】:
-
欢迎来到 StackOverflow :) 这感觉像是一个多层次的问题,有很多可能的答案。您描述的重复数据删除在 SQL 中会很复杂,所以如果您对 PHP、Java 等中的周围逻辑没问题,请提及。在巨大的 varchar 上执行此操作可能是最痛苦的方式,因此还值得一提的是是否有理由保持这种方式,或者您是否对其他设计持开放态度。发布您的 SplitString 代码将有助于指出您可以从那里去哪里。最后,这是一次性操作还是常规操作,您的数据集大小是多少?
-
感谢您的欢迎。我愿意不惜一切代价包围它。最后,我需要能够查询数据,所以我需要最终结果的格式可以导入或加载回数据库。当前数据集位于 SQL 中,它将是每周针对数千行运行的操作。
标签: sql-server tsql parsing split varchar