T-SQL等效于正则表达式'\ b'

时间:2020-01-23 09:14:07

标签: c# sql sql-server tsql

我正在将使用regex的CLR函数转换为SQL函数。我知道SQL Server不完全支持正则表达式,但是我只需要一种情况就可以搜索单词。

搜索字段值:getGreetingTime = (currentTime) => { if (!currentTime || !currentTime.isValid()) { return 'Hello'; } const splitAfternoon = 12; // 24hr time to split the afternoon const splitEvening = 17; // 24hr time to split the evening const currentHour = parseFloat(currentTime.format('HH')); if (currentHour >= splitAfternoon && currentHour <= splitEvening) { // Between 12 PM and 5PM return 'Good afternoon'; } else if (currentHour >= splitEvening) { // Between 5PM and Midnight return 'Good evening'; } // Between dawn and noon return 'Good morning'; }

.NET中的正则表达式模式:{"Id":1234, "Title": "The quick brown"}

我希望能够在搜索字段包含“ Id”:1234 但不包含“ Id”:12345

时进行匹配

我该如何实现?我已经尝试过了,但是当数字1234以空格或b而不是逗号结尾时,显然不起作用。

'\b' + '"Id":1234' '\b'

3 个答案:

答案 0 :(得分:4)

考虑到您有JSON数据,为什么不这样解析呢?

DECLARE @JSON nvarchar(MAX) = '{"Id":1234, "Title": "The quick brown"}';

SELECT *
FROM (VALUES(@JSON)) V(J)
     CROSS APPLY OPENJSON(@JSON)
     WITH (Id int,
           Title varchar(50)) OJ
WHERE OJ.Id = 1234;

答案 1 :(得分:2)

通常,仅使用正则表达式解析JSON内容并不理想。我们也许可以在这里使用SQL Server的增强型LIKE运算符:

SELECT *
FROM yourTable
WHERE json LIKE '%"Id":1234[^5]%';

这将返回所有"Id":1234的出现,其后跟5以外的任何字符。请注意,匹配项后应始终至少有一个字符,因为键值对需要在JSON中关闭

Demo

答案 2 :(得分:0)

我认为模式'%"Id":1234[^a-zA-Z0-9]%'可以。

它使用否定字符类[^a-zA-Z0-9],其作用与常规正则表达式:)

示例:

declare @tbl table (col varchar(100));
insert into @tbl values 
('{"Id":1234, "Title": "The quick brown"}'),
('{"Id":1234, "Title": "The quick brown"}'), 
('Id":1234, "Title": "The quick brown"}'), 
('{"Id":12345, "Title": "The quick brown"}');

select *
from @tbl
where col like '%"Id":1234[^a-zA-Z0-9]%'