在字符串末尾的SQL中查找字符匹配项

时间:2016-01-06 20:11:25

标签: sql sql-server

如何在sql中找到字符串中“e”的结尾

例如:

abcdeee,发生次数:3

aecdeae,发生次数:1

感谢。

2 个答案:

答案 0 :(得分:1)

目标是尽可能避免循环,因为SQL Server可以更好地处理数据集而不是按顺序处理事物。考虑到这一点,我会生成一个虚拟表,为您提供您可能找到的所有计数。为安全起见,它应与您的列长度相同。在我的例子中,我已停止在10个字符。我使用CTE生成虚拟表。您可以在那里使用变量,而不是硬编码的“e”。此外,CAST()对于避免数据类型与递归CTE不匹配很重要,但您可能需要对其进行调整,尤其是在您使用NVARCHAR时。

;WITH CTE_Characters AS
(
    SELECT
        CAST('e' AS VARCHAR(10)) AS my_char, 1 AS cnt
    UNION ALL
    SELECT
        CAST(my_char + 'e' AS VARCHAR(10)), cnt + 1
    FROM
        CTE_Characters
    WHERE
        cnt <= 9
)
SELECT
    MT.my_string,
    MAX(CTE.cnt) AS number_of_occurrences
FROM
    My_Table MT
INNER JOIN CTE_Characters CTE ON REVERSE(MT.my_string) LIKE CTE.my_char + '%'
GROUP BY
    MT.my_string

答案 1 :(得分:0)

这是一个循环,它将计算传入字符串末尾的'e'实例:

DECLARE @str nvarchar(50) = 'abcdeee'; --incoming string
DECLARE @ctr int = 0; --to count instances
DECLARE @rts nvarchar(50) = REVERSE(@str); --reverse the incoming string to start from the end
DECLARE @ind int = CHARINDEX('e',@rts,1); --find the first instance of e

WHILE @ind = 1 --only continue to count consecutive instances
    BEGIN
        SET @ctr += 1;
        SET @rts = RIGHT(@rts,LEN(@rts)-1); --remove first character and re-run
        SET @ind = CHARINDEX('e',@rts,1); --find next e
    END

SELECT @ctr AS ctr