如何使用 MS SQL 获取所有字段记录中使用的不同单词列表?

     2023-05-08     153

关键词:

【中文标题】如何使用 MS SQL 获取所有字段记录中使用的不同单词列表?【英文标题】:How to get a distinct list of words used in all Field Records using MS SQL? 【发布时间】:2008-09-19 23:00:41 【问题描述】:

如果我有一个名为“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"

【问题讨论】:

【参考方案1】:

我认为你不能用 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' ')

【讨论】:

【参考方案2】:

我刚刚遇到了类似的问题,并尝试使用 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;
    
;

【讨论】:

【参考方案3】:

这不是最快的方法,但可能会被某人用于少量数据:

declare @tmp table(descr varchar(400))

insert into @tmp
select 'The dog jumped over the fence.'
union select 'The giant tripped on the fence.'

/* the actual doing starts here */
update @tmp
set descr = replace(descr, '.', '') --get rid of dots in the ends of sentences.

declare @xml xml
set @xml = '<c>' + replace(
    (select ' ' + descr
    from @tmp
    for xml path('')
), ' ', '</c><c>') + '</c>'

;with 
allWords as (
    select section.Cols.value('.', 'varchar(250)') words
        from @xml.nodes('/c') section(Cols)
    )
select words
from allWords
where ltrim(rtrim(words)) <> ''
group by words

【讨论】:

【参考方案4】:

在 SQL 本身中,它可能需要一个大的存储过程,但是如果您将所有记录读取到您选择的脚本语言中,您可以轻松地循环它们并将每个记录拆分为数组/散列。

【讨论】:

【参考方案5】:

这将是一个混乱的存储过程,带有一个临时表和一个 SELECT DISTINCT 。

如果您已经将单词作为记录,您将使用 SELECT DISTINCT [WordsField] from [owner].[tablename]

【讨论】:

如何使用 SQL 和 PHP 从数据库 (phpMyAdmin) 的字段中获取/请求所有值?

】如何使用SQL和PHP从数据库(phpMyAdmin)的字段中获取/请求所有值?【英文标题】:HowGET/REQUESTallvaluesfromafieldinadatabase(phpMyAdmin)usingSQLandPHP?【发布时间】:2017-10-0810:25:39【问题描述】:我目前正在使用在线数据库。这是来自不同国家... 查看详情

使用日期字段使用sql server获取前一天记录

】使用日期字段使用sqlserver获取前一天记录【英文标题】:FetchPreviousdayrecordusingsqlserverusingDatefield【发布时间】:2015-01-1209:47:23【问题描述】:我想使用SqlServer中的日期字段从表中获取previousday记录。但是我正在使用下面的sql语... 查看详情

使用 MS SQL Server 2005,如何将详细记录合并到一个逗号分隔的列表中

】使用MSSQLServer2005,如何将详细记录合并到一个逗号分隔的列表中【英文标题】:UsingMSSQLServer2005,howcanIconsolidatedetailrecordsintoasinglecommaseparatedlist【发布时间】:2010-10-0713:01:30【问题描述】:背景:**我正在运行**MS2005。我有一个MA... 查看详情

如何使用sql获取前一天的记录?

】如何使用sql获取前一天的记录?【英文标题】:howtogetrecordsofpreviousdayusingtsql?【发布时间】:2012-02-1416:00:42【问题描述】:我需要前一天的所有记录吗?你好Select*fromtable1wheretabledate>getdate()-1使用此查询,我需要在午夜之后运... 查看详情

如何在 MS Access 2007 中获取 sql 查询

】如何在MSAccess2007中获取sql查询【英文标题】:howtogetsqlqueryinMSAccess2007【发布时间】:2013-06-2005:37:25【问题描述】:我正在为应用程序使用MSAccess2007数据库。我想获取要在运行时执行的查询。有没有像SQLProfile这样的MSAccess2007工... 查看详情

如何使用 MS Access 中的从句获取 MAX 值

】如何使用MSAccess中的从句获取MAX值【英文标题】:HowtogetMAXValuesusingtheHavingClauseinMSAccess【发布时间】:2012-01-1918:02:04【问题描述】:我有一个列(字段),其中包含每个实体的多个值(一对多)。示例:一条记录​​可以引用... 查看详情

SQL Server Compact - 计算记录/获取数据库中所有表使用的空间

】SQLServerCompact-计算记录/获取数据库中所有表使用的空间【英文标题】:SQLServerCompact-countrecords/getspaceusedforalltablesindatabase【发布时间】:2011-01-0517:04:00【问题描述】:有没有办法为SQLServerCompact数据库文件(SQLCE3.5.1)中的所有表获... 查看详情

在sql中,如何查询某一字段中最大值的数据

使用类似如下语句找出某个表中某个字段在你的某条件下,为最大的一条记录:selectmax(字段)form表格1where你的条件--或用下面查看这条记录里所有的字段的情况select*form表格1where字段in(selectmax(字段)form表格1where你的条件)至于“及... 查看详情

如何在时间戳字段中仅使用日期来选择记录?

】如何在时间戳字段中仅使用日期来选择记录?【英文标题】:Howtopickarecordbyusingonlydateinatimestampfield?【发布时间】:2012-04-1412:50:00【问题描述】:我正在使用HSQL创建一个应用程序。现在我需要使用某个特定日期获取所有记录-yyy... 查看详情

如何在 ms 访问中获取表的列名? [复制]

】如何在ms访问中获取表的列名?[复制]【英文标题】:howtogetcolumnnamesofatableinmsaccess?[duplicate]【发布时间】:2011-02-0404:32:28【问题描述】:如何使用查询在msaccess中获取表的字段名或列名?有人可以帮我解决这个问题吗?如果我... 查看详情

从 MS Access 中删除所有记录

...Access【发布时间】:2014-03-0806:27:51【问题描述】:我正在使用ms访问,其中1列名称为TIME作为日期/时间类型,格式为dd/mm/yyyhh:nn:ss例如时间2014年6月3日23:43:24现在使用vb.net我已经从网上获取了这段代码来将数据插入到表Table1中DimTrD... 查看详情

如何在 MS Access 中使用 C# 获取所有表名和列名?

】如何在MSAccess中使用C#获取所有表名和列名?【英文标题】:HowtogetalltablenamesandalsocolumnnameusingC#inMSAccess?【发布时间】:2013-04-1218:17:34【问题描述】:Access2007中如何用C#获取所有表名和列表名?我想将表名绑定到组合框,将列名... 查看详情

所有从 php 中的 ms access 数据库中检索数据

...录,但它只检索到一条数据。php中代码下面的哪个问题?如何使用此代码中的查询获取 查看详情

在 SQL 字段中使用 ComboBox 值的 MS 访问

】在SQL字段中使用ComboBox值的MS访问【英文标题】:MSAccessUsingComboBoxValueinSQLField【发布时间】:2016-09-1012:07:18【问题描述】:尝试设置一个查询,其中一个字段由组合框中的值选择。无法找出正确的语法。我在查询生成器的SQL视... 查看详情

Ms Access SQL:如何防止 Select 查询重复

】MsAccessSQL:如何防止Select查询重复【英文标题】:MsAccessSQL:howtopreventduplicatesfromSelectquery【发布时间】:2019-01-0823:51:44【问题描述】:我有一个Select查询(许多字段和一些计算字段),它使用非平凡的Where子句和OrderBy子句连接许... 查看详情

如何将 SQL 记录中的一个字段的值更改为另一个表中的值?

】如何将SQL记录中的一个字段的值更改为另一个表中的值?【英文标题】:HowdoIchangethevalueofonefieldinSQLrecordtoavaluefromanothertable?【发布时间】:2022-01-1522:00:15【问题描述】:首先,如果这是一个愚蠢的问题,我很抱歉。我检查了类... 查看详情

MS Access 2007 - 选择多条记录并将值分配给字段

...afield【发布时间】:2012-10-1720:08:41【问题描述】:我正在使用多项目表列出没有指定技术人员的案例(记录)(也许我应该使用数据表来列出记录?)。我希望用户从下拉字段中选择一个技术人员,该字段从员工表中获取其值(... 查看详情

delphi中如何实现对sql数据库记录进行添加,删除,修改

参考技术A使用ADO,首先用ADOConnection对象建立连接,然后使用ADOQuery对象对数据库进行操作。ADOQuery对象操作:查询:先使用close;再设置SQL.text为SQL查询语句内容;最后使用OPEN方法打开添加:Append或Insert;FieldByName('字段名... 查看详情