递归CTE使用已定义的函数显示成功的总次数并且对函数

时间:2015-09-01 03:10:46

标签: sql sql-server recursion common-table-expression

我有一个用户定义的函数,它接受一个消息(VARCHAR)作为参数,如果消息包含已定义的子字符串,则返回1;如果消息不包含,则返回0。此代码按预期工作:

--Create function to take one VARCHAR parameter and return one INTEGER
CREATE FUNCTION dbo.checkLetters (@MESSAGE VARCHAR(MAX))
RETURNS INTEGER
WITH RETURNS NULL ON NULL INPUT
AS
BEGIN
    --Variable to store the 1 or 0
    DECLARE @value INTEGER;

    --Match
    IF @MESSAGE LIKE '%lhl%'
        SET @value = 1

    --No Match
    ELSE
        SET @value = 0

    RETURN @value
END;

我现在想要创建一个递归CTE,将此函数应用于包含大字符串的表中的特定列。但是我希望这个CTE显示总数为1,并且从整个表返回的总数为0。我该怎么做呢?

这就是我的想法:

  1. 阅读第一行并在消息列上执行功能
  2. 增量变量1(成功)或0(失败
  3. 重复其余行并再次增加
  4. 返回total1和total0的
  5. 我不想使用游标。

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,您希望计算与'%lhl%'匹配的表中的行数,或者任何字符串模式。您可以使用简单的SELECT语句执行此操作:

DECLARE @pattern VARCHAR(10) = '%lhl%'

SELECT
    Successes   = SUM(CASE WHEN [message] LIKE @pattern THEN 1 ELSE 0 END),
    Fails       = SUM(CASE WHEN [message] LIKE @pattern THEN 0 ELSE 1 END)      
FROM your_table