我正在将使用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'
答案 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中关闭
答案 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]%'