SQL Server 2008 R2在一组文本字符串之间获取通用文本

时间:2013-02-24 20:20:26

标签: sql string text sql-server-2008-r2 words

我当然希望有人可以帮我解决这个问题。我一直在寻找好几个小时才能找到它但是我空了。

在这个例子中,我的表中有两列

GRP_ID    Desc

我的群组ID是我识别这些产品属于同一类型的方式,而desc就是我想找到的所有常用词。

所以这是我的表

GRP_ID          Desc
-------------------------------   
2               Red Hat
2               Green Hat
2               Yellow Hat
3               Boots Large Brown
3               Boots Medium Red
3               Boots Medium Brown

作为查询结果我想要的是以下

GRP_ID           Desc
-----------------------    
2                Hat
3                Boots

所以我想要的是组中每个字符串中出现的所有单词或组中的常用单词。

2 个答案:

答案 0 :(得分:0)

我认为你需要为GRP_ID和产品创建一个映射表 - 例如帽子和靴子。

CREATE TABLE GroupProductMapping (
    GRP_ID INT NOT NULL, -- I'm assuming its an Int
    ProductDesc VARCHAR(50) NOT NULL
)

SELECT a.GRP_ID,
    b.ProductDesc Desc
FROM {Table_Name} a
INNER JOIN GroupProductMapping b ON a.GRP_ID = b.GRP_ID

或者,如果您没有太多产品。您可以在SELECT子句中使用CASE。 e.g。

SELECT 
    GRP_ID,
    CASE GRP_ID 
        WHEN 1 THEN 'Hat' 
        WHEN 2 THEN 'Boots'
    END AS Desc
FROM {Table_Name}

{Table_Name}是原始表的名称。

答案 1 :(得分:0)

理想情况下,您可以规范化数据并将单词存储在单独的表中。

但是,根据您的直接要求,您首先需要提供一个UDF来将“desc”拆分为单词。我挖走了this function

-- this function splits the provided strings on a delimiter
-- similar to .Net string.Split.
-- I'm sure there are alternatives (such as calling string.Split through
-- a CLR function).  
CREATE FUNCTION [dbo].[Split]
(    
    @RowData NVARCHAR(MAX),
    @Delimeter NVARCHAR(MAX)
)
RETURNS @RtnValue TABLE 
(
    ID INT IDENTITY(1,1),
    Data NVARCHAR(MAX)
) 
AS
BEGIN 
    DECLARE @Iterator INT
    SET @Iterator = 1

    DECLARE @FoundIndex INT
    SET @FoundIndex = CHARINDEX(@Delimeter,@RowData)

    WHILE (@FoundIndex>0)
    BEGIN
        INSERT INTO @RtnValue (data)
        SELECT 
            Data = LTRIM(RTRIM(SUBSTRING(@RowData, 1, @FoundIndex - 1)))

        SET @RowData = SUBSTRING(@RowData,
                @FoundIndex + DATALENGTH(@Delimeter) / 2,
                LEN(@RowData))

        SET @Iterator = @Iterator + 1
        SET @FoundIndex = CHARINDEX(@Delimeter, @RowData)
    END

    INSERT INTO @RtnValue (Data)
    SELECT Data = LTRIM(RTRIM(@RowData))

    RETURN
END

然后你需要拆分描述并进行一些分组(如果数据被规范化你也会这样做)

-- get the count of each grp_id
with group_count as
(
    select grp_id, count(*) cnt from [Group]
    group by grp_id
),
-- get the count of each word in each grp_id
group_word_count as
(
    select count(*) cnt, grp_id, data from 
    (
        select * from [group] g
        cross apply dbo.Split(g.[Desc], ' ') 
    )
    t
    group by grp_id, data
)
-- return rows where number of grp_id = number of words in grp_id
select gwc.GRP_ID, gwc.Data [Desc] from group_word_count gwc 
inner join group_count gc on gwc.GRP_ID = gc.GRP_ID and gwc.cnt = gc.cnt

[集团]是你的表格。