如何解决在 SQL Server 的 nvarchar 列中搜索电子邮件
我希望在 sql Server 的 nvarchar 列中搜索特定电子邮件(例如 fname@exmaple.com)。它应该像 -
一样简单Select * from discussion where Comments like '%fname@example.com%'
然而,上述查询并未涵盖一种情况。如果结果集包含诸如“来自具有电子邮件 selfname@example.com 的用户的评论”之类的评论。在这种情况下,上述查询将返回包含“fname@example.com”和“selfname@example.com”的两条记录。
我正在寻找一个 sql 查询,其中电子邮件地址完全匹配,其余文本可以是任何内容。
我正在尝试在多个表格中搜索电子邮件。我们搜索电子邮件的列可以是 xml,nvarchar(max) 用于评论,nvarchar(50) 仅用于电子邮件。我们需要在记录集上执行另一项工作。
结果集: 如果我正在搜索“fname@example.com”,结果集应包含以下内容:
- lorem ipsum fname@exmaple.com
- fname@example.com lorem ipsum
- Lorem ipsum fname@exmaple.com dolor sat amet
结果集不应包含以下内容:
- selfname@example.com dolor sat amet
- Lorem ipsum selfname@exmaple.com dolor sat amet
提前致谢。
解决方法
也许检查电子邮件之后或之前的非字母数字字符(如此处所述:LIKE Transact-SQL)并区分所有可能的情况可能会很有用:
-
电子邮件在中间
-
电子邮件在开头
-
电子邮件在最后
-
列只包含电子邮件
SELECT * FROM Discussion WHERE Comments LIKE '%[^a-z0-9]fname@example.com[^a-z0-9]%' --CASE 1 OR Comments LIKE 'fname@example.com[^a-z0-9]%' --CASE 2 OR Comments LIKE '%[^a-z0-9]fname@example.com' --CASE 3 OR Comments = 'fname@example.com' --CASE 4
此外,通过这种方式,您可以涵盖诸如“Lorem ipsum:fname@exmaple.com”之类的情况,您可能想检测这些情况,并且它应该可以正常工作。
,首先,我们需要找到文本中包含的电子邮件地址,为此,我们需要识别“@”,为此,我们需要编写如下查询
SELECT Id,Comments as Text,CASE
WHEN CHARINDEX('@',Comments) = 0 THEN NULL
ELSE SUBSTRING(Comments,beginningOfEmail,endOfEmail-beginningOfEmail)
END email
INTO #Temp1 FROM Discussion
CROSS APPLY (SELECT CHARINDEX(' ',Comments + ' ',CHARINDEX('@',Comments ))) AS A(endOfEmail)
CROSS APPLY (SELECT DATALENGTH(Comments )/2 - CHARINDEX(' ',REVERSE(' ' + Comments),REVERSE(' ' + Comments ))) + 2) AS B(beginningOfEmail)
-- stored data in Temp table,you can use alternative
SELECT id,email FROM #Temp1
DROP table #Temp1
输出
id email
1 fname@exmaple.com
2 fname@example.com
3 hname@example.com
4 fname@exmaple.com
5 fname@example1.com
6 selfname@example.com
然后我们需要在#Temp表中再做一个过滤 喜欢
SELECT id,email FROM #Temp1
where LEFT(email,email + '@') -1) like 'fname'
或
SELECT id,email FROM #Temp1
where LEFT(email,email + '@') -1) = 'fname'
输出
id email
1 fname@exmaple.com
2 fname@example.com
4 fname@exmaple.com
5 fname@example1.com
您可以复制并粘贴此查询并从我的角度检查其工作情况,
,如果您可以假设电子邮件位于开头、结尾或被空格包围,那么您可以使用空格填充模式和 <html>
<head></head>
<body>
Status: <span id="status-txt">Disconnected</span>
<br/>
<br/>
<div id="response-body"></div>
</body>
</html>
<!-- Events SDK -->
<script src="some-source.js"></script>
<script>
let sdk = new EventsSDK({
loginType: 'token',useLoginApi: true,token: 'token',});
sdk.init().then(function () {
// Success login event
sdk.on('loginSuccess',function (response) {
document.getElementById("status-txt").innerHTML = "Connected";
})
// Extension event
sdk.on('ExtensionEvent',function (response) {
console.log(response);
const cur = document.getElementById("response-body");
cur.innerHTML = cur.innerHTML + response.data.reason + "<br />";
})
// After logging in,receive all extensions statuses
sdk.on('AllExtensionsStatus',function (response) {
console.log(response);
})
});
:
comments
如果可以有其他分隔符——例如括号、语法等——那么这就更麻烦了。一种方法是使用 where concat(' ',Comments,' ') like '% fname@example.com %'
:
translate()
不幸的是,where concat(' ',translate(Comments,'(),:;',' '),' ') like '% fname@example.com %'
是您正在寻找的模式的一部分,因此也很难将其包含在内。
我想出了以下查询。
7 |
8 | import React from 'react';
> 9 | import type {
| ^
10 | ViewStyleProp,11 | TextStyleProp,12 | } from 'react-native/Libraries/StyleSheet/StyleSheet';
我正在寻找完全匹配或以其他方式检查前后字符以评估匹配是否符合条件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。