如何在“始终加密”列中按多个值进行搜索?

问题描述 投票:2回答:1

如果我使用确定性加密,我可以在加密列中执行搜索。例如:

DECLARE @email NVARCHAR(222) = 'test';

SELECT *
FROM Users
Where email = @email;

但是如何通过多个值执行搜索?例如,如果我想获取电子邮件地址为[email protected][email protected][email protected]的记录。

我无法创建许多输入参数,因为通常这些值是动态的,并且例如以CSV字符串传递。

sql-server tsql sql-server-2016 always-encrypted
1个回答
0
投票

在你的情况下,我建议拆分,如果它适合你。

试试这个问题:让我知道它是否适合你

DECLARE @email NVARCHAR(222) = '[email protected],[email protected],[email protected]'
DECLARE @Delimiter NCHAR(1) = ','

DECLARE @EmailParam TABLE(email NVARCHAR(222))

;WITH Split(StPos,EndPos)
AS(
    SELECT 0 AS StPos, CHARINDEX(@Delimiter,@email) AS EndPos
    UNION ALL
    SELECT EndPos+1, CHARINDEX(@Delimiter,@email,EndPos+1)
    FROM Split
    WHERE EndPos > 0
)

INSERT INTO @EmailParam (email)
SELECT SUBSTRING(@email,StPos,COALESCE(NULLIF(EndPos,0),LEN(@email)+1)-StPos) FROM Split

SELECT Users.*
FROM Users
INNER JOIN @EmailParam EmailParam
ON Users.email = EmailParam.email;

说明:

  • 我刚刚扩展了您的查询以处理多个电子邮件。
  • 正如您所提到的,如果确定输入格式是逗号分隔的字符串,则可能值得尝试从中派生表变量。
  • 所以如果您的输入如下: DECLARE @email NVARCHAR(222) = '[email protected],[email protected],[email protected]' 您可以使用任何tsql技术拆分它,我在这里使用了公用表表达式。
  • 一旦你以表格格式获得它。我在这里名为@EmailParam的表变量中得到了它。然后,您可以轻松使用添加联接并对其进行过滤。
  • 如果你的查询使用确定性加密,那么这个查询可能会以类似的方式工作,因为只有文件管理器的额外更改我们现在有inner join。 ,
© www.soinside.com 2019 - 2024. All rights reserved.