Sql server Regex仅获取字符串中每个数字的最后一次出现
我正在使用SQL Server,遇到了一个我没有答案的情况。详情如下: 例如,给定一个字符串Sql server Regex仅获取字符串中每个数字的最后一次出现,sql-server,regex,Sql Server,Regex,我正在使用SQL Server,遇到了一个我没有答案的情况。详情如下: 例如,给定一个字符串diuuuu,我希望此输出diu。它背后的逻辑是顺序中每个数字(d,i,u)的最后一次出现。其他示例: diudi=udi dididi=di 如能提供正则表达式解决方案,将不胜感激。谢谢大家! 这并不特别漂亮,但它确实起到了作用: WITH VTE AS( SELECT * FROM (VALUES('diudi'),('diuuuu'),('dididi'),('ddddd'))V(Y
diuuuu
,我希望此输出diu
。它背后的逻辑是顺序中每个数字(d,i,u)的最后一次出现。其他示例:diudi
=udi
dididi
=di
如能提供正则表达式解决方案,将不胜感激。谢谢大家! 这并不特别漂亮,但它确实起到了作用:
WITH VTE AS(
SELECT *
FROM (VALUES('diudi'),('diuuuu'),('dididi'),('ddddd'))V(YourColumn)),
Ranks AS(
SELECT V.YourColumn,
CI.C,
CI.I,
RANK() OVER (PARTITION BY V.YourColumn ORDER BY CI.I) AS R
FROM VTE V
CROSS APPLY (VALUES(REVERSE(V.YourColumn)))R(YourColumn)
CROSS APPLY (VALUES('d',CHARINDEX('d',R.YourColumn)),
('i',CHARINDEX('i',R.YourColumn)),
('u',CHARINDEX('u',R.YourColumn)))CI(C,I))
SELECT YourColumn,
REVERSE(CONCAT(MAX(CASE WHEN R = 1 AND I > 0 THEN C END),MAX(CASE WHEN R = 2 AND I > 0 THEN C END),MAX(CASE WHEN R = 3 AND I > 0 THEN C END)))
FROM Ranks
GROUP BY YourColumn;
这应该起作用:
(.)(?!.*\1)
返回的组连接在一起,可以满足您的需要。下面是一个SQL答案:
CREATE FUNCTION dbo.udf_LastChars(@str VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @result VARCHAR(100)
DECLARE @char CHAR(1)
DECLARE @i INT = 1
WHILE (@i <= LEN(@str))
BEGIN
SET @char = SUBSTRING(@str, @i, 1)
SET @result = CONCAT(REPLACE(@result, @char, ''), @char)
SET @i = @i + 1
END
RETURN @result
END
创建函数dbo.udf\u LastChars(@str VARCHAR(100))
返回VARCHAR(100)
作为
开始
声明@result VARCHAR(100)
声明@char(1)
声明@i INT=1
WHILE(@i)这是查找每个字母的最后一次出现。这里的正则表达式逻辑是“忽略所有字符,其中字符串后面有一个相同的字符”可能是以下内容的副本:不。这是T-SQL而不是Regex,它得到了第一个字符……SQL Server使用T-SQL@MPost,而SQL Server本机不支持Regex。这篇文章有点混乱,因为主要问题引用了SQL Server,但标题引用了Regex。不确定这里需要哪个字符。OP在SQL中如何使用它服务器?请求结束:“非常感谢正则表达式解决方案。谢谢!”可能正在开发CLR DLL。我本以为问题已经用C#标记了,因为OP应该包含CLR函数的现有代码。是的,我可以使其更有效,但它易于使用和理解。