SQL If-Else逻辑基于一个表的值

时间:2014-12-05 15:32:58

标签: sql sql-server stored-procedures

我有以下表格:

生产表

SerialNumber  WorkOrderNumber  ItemName   ItemType
   1234           A2234          ASD        1
   1234           A2234          ASD-T      2 
   1111           B2234          ZXC-T      2

WorkOrder表

WorkOrderNumber ItemName ItemType 
     B2234         ZXC       1
     B2234         ZXC-T     2
     B2234         ZXC-C     3

场景:用户输入序列号,想要从生产表或工作订单表中获取itemtype = 1的项目名称

期望的结果

用户输入应用程序中的序列号1234:

ItemName:ASD [在生产表中找到]

用户输入应用程序中的序列号1111:

ItemName:ZXC [在工单表中找到]

为了演示目的,大大简化了生产和工作订单表。该表每行包含数百万行。我需要提出一个高性能的查询来获取项目名称。

我想到的唯一解决方案是执行以下操作

  1. 使用存储过程并编写if-else逻辑
    • 检查输入的序列号的项目类型是否为1.如果为true,则返回itemname。
    • 如果itemtype不是1,请使用itemtype = 1
    • 从workorder表中获取itemname
  2. 但我不确定这是否是首选的性能方法,而且我觉得将业务逻辑放在数据库中有点蠢。

    如何优雅地处理这个问题?

1 个答案:

答案 0 :(得分:1)

试试这个:

select top 1 pt.serialNumber,pt.workOrderNumber,
       isNull(wt.ItemName,pt.ItemName) as NameToReturn
from prodTable pt
left join worktable wt on pt.WorkOrderNumber=wt.workOrderNumber and wt.itemType=1
where pt.serialNumber = <input>
order by p1.itemType

我不确定我是否了解您的所有要求,但上述内容应该为您提供一个起点。它在prodTable中找到该部件,并可选择在工作项表中找到一个部件。 Null逻辑假定如果Work表中存在类型1,则将使用它。如果您的规则不同(例如,prod表中的1应覆盖工作表),您可能需要将此调整为case语句