SQL Server:CASE语句中的OR语句

时间:2018-05-22 21:43:15

标签: sql sql-server stored-procedures sql-server-2016

我有一个存储过程,它根据用户发送的内容查询一些员工记录。

在用户界面上,用户将输入多个数据点,例如电子邮件地址,用户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 NamePreferred NameLast Name

我基本上需要测试用户提供的内容,并根据他们输入的组合查找员工。 UI中的所有用户都选择提供名称,但不提供其所在的格式。

出于这个原因,我需要检查一下我是否能找到几种不同格式的记录。

在这种情况下的问题是我无法使用OR语句中的CASE条件加入我的数据集。

如果@dataType = 'Name',我需要能够将我的临时表加入到几种不同的组合可能性中。

我们确实让他们意识到的一件事是他们无法混合搭配。这意味着他们无法通过FirstName LastName搜索进行LastName FirstName

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

2 个答案:

答案 0 :(得分:0)

推动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
...

答案 1 :(得分:0)

将OR加入你的加入怎么样?

return Response.ok(reader, MediaType.APPLICATION_XML_TYPE)
                .header(CONTENT_DISPOSITION, "attachment; filename=" + "packData_" + productCode + "_" + batchId + "_" + timeStamp + ".xml")
                .build();

我不确定SQL是否足够聪明,如果你有这些字段就可以在这些字段上使用正确的索引,尤其是在组合列时。您可以为那些组合名称或可以索引的计算列创建索引视图。最好将它们分散到if / thens中的单独查询中,以便SQL可以根据您加入的字段优化每个查询,然后执行一个查询。