gpt4 book ai didi

tsql - 是否可以匹配 PATINDEX 中除 ']' 之外的任何字符?

转载 作者:行者123 更新时间:2023-12-01 16:13:41 24 4
gpt4 key购买 nike

我需要找到第一个不是 ] 的字符的索引。通常,要匹配除 X 之外的任何字符,请使用模式 [^X]。问题是 [^]] 只是过早地关闭了第一个括号。第一部分 [^] 将匹配任何字符。

LIKE operator 的文档中,如果向下滚动到“使用通配符作为文字”部分,它会显示一个方法表,用于指示模式内的文字字符,例如 []。它没有提到在双括号内使用 [] 。如果该模式与 LIKE 运算符一起使用,则可以使用 ESCAPE 子句。 LIKE 不返回索引,并且 PATINDEX 似乎没有转义子句的参数。

没有办法吗?

(这可能看起来是任意的。为了在它周围添加一些上下文,我需要匹配 ] 后紧跟一个不是 ] 的字符,以便找到结尾带引号的标识符。]] 是带引号的标识符内唯一的字符转义。)

最佳答案

这是不可能的。连接项PATINDEX Missing ESCAPE Clause已关闭,因为无法修复。

我可能会使用 CLR 和正则表达式。

一个简单的实现可能是

using System.Data.SqlTypes;
using System.Text.RegularExpressions;

public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlInt32 PatIndexCLR(SqlString pattern, SqlString expression)
{
if (pattern.IsNull || expression.IsNull)
return new SqlInt32();

Match match = Regex.Match(expression.ToString(), pattern.ToString());
if (match.Success)
{
return new SqlInt32(match.Index + 1);
}
else
{
return new SqlInt32(0);
}
}
}

示例用法

SELECT  [dbo].[PatIndexCLR] ( N'[^]]', N']]]]]]]]ABC[DEF');

如果这不是一个选项,则可能的不稳定解决方法可能是替换数据中不太可能出现的字符,而在语法中没有这种特殊意义。

WITH T(Value) AS
(
SELECT ']]]]]]]]ABC[DEF'
)
SELECT PATINDEX('%[^' + char(7) + ']%', REPLACE(Value,']', char(7)))
FROM T

(返回9)

关于tsql - 是否可以匹配 PATINDEX 中除 ']' 之外的任何字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30550715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com