如何使用MS SQL获取所有字段记录中使用的单词的不同列表?
时间:2020-03-06 14:28:10 来源:igfitidea点击:
如果我有一个名为" description"的表字段,那么什么是SQL(使用MS SQL)来获取该字段中使用的所有不同单词的记录列表。
例如:
如果表格的"说明"字段包含以下内容:
Record1 "The dog jumped over the fence." Record2 "The giant tripped on the fence." ...
SQL记录输出为:
"The","giant","dog","jumped","tripped","on","over","fence"
解决方案
这将是一个混乱的存储过程,最后是一个临时表和一个SELECT DISTINCT。
如果我们已经有单词作为记录,则可以使用[所有者]中的SELECT DISTINCT [WordsField]。[表名]
我不认为我们可以使用SELECT来做到这一点。最好的机会是编写一个用户定义的函数,该函数将返回包含所有单词的表,然后对其执行SELECT DISTINCT。
免责声明:函数dbo.Split来自http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648
CREATE TABLE test ( id int identity(1, 1) not null, description varchar(50) not null ) INSERT INTO test VALUES('The dog jumped over the fence') INSERT INTO test VALUES('The giant tripped on the fence') CREATE FUNCTION dbo.Split ( @RowData nvarchar(2000), @SplitOn nvarchar(5) ) RETURNS @RtnValue table ( Id int identity(1,1), Data nvarchar(100) ) AS BEGIN Declare @Cnt int Set @Cnt = 1 While (Charindex(@SplitOn,@RowData)>0) Begin Insert Into @RtnValue (data) Select Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1))) Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData)) Set @Cnt = @Cnt + 1 End Insert Into @RtnValue (data) Select Data = ltrim(rtrim(@RowData)) Return END CREATE FUNCTION dbo.SplitAll(@SplitOn nvarchar(5)) RETURNS @RtnValue table ( Id int identity(1,1), Data nvarchar(100) ) AS BEGIN DECLARE My_Cursor CURSOR FOR SELECT Description FROM dbo.test DECLARE @description varchar(50) OPEN My_Cursor FETCH NEXT FROM My_Cursor INTO @description WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO @RtnValue SELECT Data FROM dbo.Split(@description, @SplitOn) FETCH NEXT FROM My_Cursor INTO @description END CLOSE My_Cursor DEALLOCATE My_Cursor RETURN END SELECT DISTINCT Data FROM dbo.SplitAll(N' ')
单独使用SQL可能会需要一个很大的存储过程,但是如果我们将所有记录读入我们选择的脚本语言中,则可以轻松地遍历它们并将它们分成数组/哈希。
我只是遇到了类似的问题,并尝试使用SQL CLR来解决它。可能对某人有用
using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.Collections; using System.Collections.Generic; public partial class UserDefinedFunctions { private class SplitStrings : IEnumerable { private List<string> splits; public SplitStrings(string toSplit, string splitOn) { splits = new List<string>(); // nothing, return empty list if (string.IsNullOrEmpty(toSplit)) { return; } // return one word if (string.IsNullOrEmpty(splitOn)) { splits.Add(toSplit); return; } splits.AddRange( toSplit.Split(new string[] { splitOn }, StringSplitOptions.RemoveEmptyEntries) ); } #region IEnumerable Members public IEnumerator GetEnumerator() { return splits.GetEnumerator(); } #endregion } [Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "readRow", TableDefinition = "word nvarchar(255)")] public static IEnumerable fnc_clr_split_string(string toSplit, string splitOn) { return new SplitStrings(toSplit, splitOn); } public static void readRow(object inWord, out SqlString word) { string w = (string)inWord; if (string.IsNullOrEmpty(w)) { word = string.Empty; return; } if (w.Length > 255) { w = w.Substring(0, 254); } word = w; } };