--where 'email@aol.com' in(o.SuOrderEmailAddress, o.SuBusEmailAddress, o.SuReturnEmail, O.SuPartsEmail) and es.ictid = 7
我想在多列中搜索一个变量(电子邮件地址)。这就是我现在所拥有的,它的确有效。
我想我需要使用Like,因为我想使用通配符。例如,能够使用*@aol.com非常有帮助。现在我必须输入一个确切的电子邮件地址。
--Where s.suname like 'rizt%'and es.ictid = 7
在上面的示例中这很简单,但是一旦我重新排列语法以执行多个列,我就会丢失到可以使用LIKE的位置,以便我可以使用通配符。
由于
答案 0 :(得分:0)
您只需查看电子邮件地址的末尾即可。大多数数据库都支持right()
函数:
where '@aol.com' in (right(o.SuOrderEmailAddress, 8),
right(o.SuBusEmailAddress, 8),
right(o.SuReturnEmail, 8),
right(o.SuPartsEmail, 8)
) and
es.ictid = 7
(通常,即使没有right()
的数据库也具有等效功能。)
某些数据库支持正则表达式,这是另一种选择。或者,在您的情况下,字符串连接甚至可以工作。
编辑:
如果你有变量,你可以这样做:
where @var in (right(o.SuOrderEmailAddress, len(@var)),
right(o.SuBusEmailAddress, len(@var)),
right(o.SuReturnEmail, len(@var)),
right(o.SuPartsEmail, len(@var))
) and
es.ictid = 7
答案 1 :(得分:0)
我认为真正的答案是使用全文索引(如果您使用的是MS SQL - 否则会查看您使用的服务器是否存在等效项)。但是,这是一个应该有效的丑陋黑客:
WHERE ISNULL(o.SuOrderEmailAddress, '') + '|'
+ ISNULL(o.SuBusEmailAddress, '') + '|'
+ ISNULL(o.SuReturnEmail, '') + '|'
+ ISNULL(O.SuPartsEmail, '') LIKE @pattern
在检查@pattern的连接字符串之前,这只是简单地将所有相关字段连接到一个以管道分隔的列表。
答案 2 :(得分:0)
这是一般的想法。通常,@ search将是存储过程的参数。首先查看WHERE子句。
declare @search varchar(50) = '@aol.com'
set @search = '%' + @search + '%'
select case when o.SuOrderEmailAddress like @search then o.SuOrderEmailAddress
when o.SuBusEmailAddress like @search then o.SuBusEmailAddress
when o.SuReturnEmail like @search then o.SuReturnEmail
when o.SuPartsEmail like @search end as matchedEmail
from MyTable as o
where (o.SuOrderEmailAddress like @search
or o.SuBusEmailAddress like @search
or o.SuReturnEmail like @search
or o.SuPartsEmail like @search) and ...
您可以控制前端添加'%'。在我看来,这是为读者写的清楚,并为您提供了匹配的电子邮件地址。