首页 > 解决方案 > 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

我很难解释这一点,所以如果我需要以某种方式澄清,请告诉我。

标签: sqlsql-serverstored-proceduressql-server-2016

解决方案


推入 中的方程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
...

推荐阅读