2013-04-22 64 views
3

我在单元格中有一个| b | c | d | ..值。如何使用通过分隔符拆分并计数与分隔符合并的值

+0

这与SQL有什么关系? – ApplePie 2013-04-22 11:43:02

+0

你使用的是什么rdbms? – 2013-04-22 11:50:29

+0

@ Alexandre P. Levasseur在mssql中,我有一列字符。第一行有a | b | c | d,第二行有b | a | h | o |,第三行有o | h | a | b,我需要每个单独字符的总发生次数。谢谢 – Candy 2013-04-22 11:58:02

回答

9

的帮助分裂它来计算所有调用B的总发生。如果你需要统计出现的次数,你可以使用这个(SQL服务器):

SELECT LEN(yourColumn) - LEN(REPLACE(yourColumn, 'b', '')) FROM yourTable 
+0

+1主题发起者不清楚分隔词的长度。他们只是单个字符或单词。所以我认为你应该不仅仅使用'b'而是'| b |' +选中'b |'在行的开始和'| b'在行的结尾。 – valex 2013-04-22 11:53:08

+0

但OP想要所有'b'的总数。看看:http://sqlfiddle.com/#!3/e618c/2/1(恕我直言4将是正确的)因此,你计算'b | bb'为三个B而不是一个。 – 2013-04-22 11:55:53

+0

@TimSchmelter那么,他不太清楚OP的想法是什么。我假设我们的答案和评论将帮助他改变他的结果 – Alex 2013-04-22 12:02:16

2

我的SQL Server 2005的并使用此功能Split

SELECT split.Item, count=Count(*) 
FROM dbo.Foo f 
CROSS APPLY dbo.Split(f.ColName, '|')split 
GROUP BY split.Item 
Having split.Item='b' 

这里的表值函数:

CREATE FUNCTION [dbo].[Split] 
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @IDTable TABLE (Item VARCHAR(50)) 
AS  

BEGIN  
    DECLARE @tempItemList NVARCHAR(MAX) 
    SET @tempItemList = @ItemList 

    DECLARE @i INT  
    DECLARE @Item NVARCHAR(4000) 

    SET @tempItemList = REPLACE (@tempItemList, ' ', '') 
    SET @i = CHARINDEX(@delimiter, @tempItemList) 

    WHILE (LEN(@tempItemList) > 0) 
    BEGIN 
     IF @i = 0 
      SET @Item = @tempItemList 
     ELSE 
      SET @Item = LEFT(@tempItemList, @i - 1) 
     INSERT INTO @IDTable(Item) VALUES(@Item) 
     IF @i = 0 
      SET @tempItemList = '' 
     ELSE 
      SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i) 
     SET @i = CHARINDEX(@delimiter, @tempItemList) 
    END 
    RETURN 
END 

DEMO

+0

完美的作品!非常感谢。 – hikalkan 2014-06-19 08:20:55