sql - SQL Server:CASE 语句中的 OR 语句
问题描述
我有一个存储过程,它根据用户发送的内容查询一些员工记录。
在 UI 上,用户将输入多个数据点,例如电子邮件地址、用户 ID 或员工姓名。此存储过程检查它们提供的数据类型,然后在数据库中的该字段中搜索记录。
存储过程的输入:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<data>
<dataPoints>
<dataPoint>
<order>0</order>
<value>Jim Bob</value>
</dataPoint>
<dataPoint>
<order>1</order>
<value>Sally Jones</value>
</dataPoint>
</dataPoints>
</data>
</root>
询问:
@dataType VARCHAR (20), @data XML
AS
BEGIN
SET NOCOUNT ON;
BEGIN
-- Create a temp table
DECLARE @dataSet TABLE (data VARCHAR(100), [order] INT);
INSERT INTO @dataSet( data , [order] )
SELECT
ParamValues.x1.value('value[1]', 'VARCHAR(100)') ,
ParamValues.x1.value('order[1]', 'INT')
FROM
@data.nodes('/root/data/dataPoints/dataPoint') AS ParamValues(x1)
-- Search Employees
SELECT
ec.FirstName, ec.PreferredName, ec.LastName,
ec.NTID, ec.QID,
ec.DepartmentName, ec.SegmentName,
ec.CenterName, ec.RoleName, ec.MarketName,
ec.IncentivePlanName,
ec.CostCenterID,
ec.SupFirstName, ec.SupPreferredName, ec.SupLastName,
ec.SiloName,
ec.AreaName,
ec.PersonnelID,
d.[order]
FROM
Resources.emp.EmployeeComplete AS ec
INNER JOIN
@dataset AS d ON d.data = CASE
WHEN @dataType = 'NTID' THEN ec.ntid
WHEN @dataType = 'QID' THEN ec.QID
WHEN @dataType = 'Emp ID' THEN ec.EmpID
WHEN @dataType = 'Email Address' THEN ec.Email
WHEN @dataType = 'Personnel ID' OR @dataType = 'Sap ID' THEN ec.PersonnelID
--WHEN @dataType = 'Name' THEN (
-- (ec.FirstName + ' ' + ec.LastName)
-- OR (ec.PreferredName + ' ' + ec.LastName)
-- OR (ec.LastName + ', ' + ec.FirstName)
-- OR (ec.LastName + ', ' + ec.PreferredName
-- )
END
FOR XML PATH ('employees'), ELEMENTS, TYPE, ROOT ('root');
简而言之,我将正在搜索的多个数据点放入 XML 字符串中以传递给存储过程。一旦他们到达,我将它们放入一个临时表中,以便我可以将其与我的主要员工记录一起加入。
问题/问题:
您会看到我的示例中有一些注释掉的代码,这就是我的问题所在。我的数据库中有三个名称字段。First Name
, Preferred Name
, Last Name
.
我基本上需要测试用户提供的内容并根据他们输入的组合找到员工。用户在 UI 中选择的所有内容是他们提供了一个名称,而不是它的格式。
出于这个原因,我需要检查是否可以找到几种不同格式的记录。
这种情况下的问题是我无法使用语句OR
中的条件加入我的数据集。CASE
如果@dataType = 'Name'
,我需要能够在几个不同的组合可能性上加入我的临时表。
我们让他们意识到的一件事是他们不能混搭。这意味着他们无法进行FirstName LastName
搜索LastName FirstName
。
我很难解释这一点,所以如果我需要以某种方式澄清,请告诉我。
解决方案
推入 中的方程CASE
。如果它们为真,则THEN
返回 1。检查是否CASE
返回 1。当且仅当它返回时,您找到了匹配项。在条件下WHEN
可以使用布尔运算符。所以你可以在那里建立你的OR
(或IN
像我下面那样使用)。
...
CASE
WHEN @dataType = 'NTID' AND d.data = ec.ntid THEN 1
WHEN @dataType = 'QID' AND d.data = ec.QID THEN 1
...
WHEN (@dataType = 'Personnel ID' OR @dataType = 'Sap ID') AND d.data = ec.PersonnelID THEN 1
WHEN @dataType = 'Name' AND (d.data IN ('' + ec.FirstName + ' ' + ec.LastName,
'' + ec.PreferredName + ' ' + ec.LastName,
'' + ec.LastName + ', ' + ec.FirstName,
'' + ec.LastName + ', ' + ec.PreferredName) THEN 1
END = 1
...
推荐阅读
- python - 如何获得一致的 python 日志记录格式?
- sql-server - 避免在删除\插入事务中违反主键?
- python - 如何修复 ValueError: Graph disconnected: cannot get value for tensor in tensorflow?
- vim - 如何在 .vimrc 中添加 ":highlight Normal ctermbg=yellow"
- r - 为什么桑基图中的第一个链接没有在 R 中显示?
- sql - SQL:如何找到对已删除评论的所有回复?
- python - 将数据帧保存到磁盘会丢失 numpy 数据类型
- performance - Linux 如何在内存模式下处理 Intel 的 Optane Persistent Memory Modules?
- mysql - Doctrine Query Builder,如何转义单引号?
- bash - Mac Shell .sh 命令不可能