如果位标志为真,则检索其他行

时间:2013-09-20 20:50:41

标签: sql sql-server sql-server-2008 tsql

我有一个大的存储过程,用于返回包含许多选择的对话框的结果。如果特定位列设置为true,我有一个新标准来获取“额外”行。目前的设置如下:

SELECT
  CustomerID,
  FirstName,
  LastName,
  ...
FROM HumongousQuery hq
LEFT JOIN (
    -- New Query Text
) newSubQuery nsq ON hq.CustomerID = nsq.CustomerID

我有新查询的前半部分:

SELECT DISTINCT 
    c.CustomerID,
    pp.ProjectID,
    ep.ProductID
FROM Customers c
JOIN Evaluations e (NOLOCK)
    ON c.CustomerID = e.CustomerID
JOIN EvaluationProducts ep (NOLOCK)
    ON e.EvaluationID = ep.EvaluationID
JOIN ProjectProducts pp (NOLOCK)
    ON ep.ProductID = pp.ProductID
JOIN Projects p
    ON pp.ProjectID = p.ProjectID
WHERE 
    c.EmployeeID = @EmployeeID
    AND e.CurrentStepID = 5
    AND p.IsComplete = 0

Projects表有一个位列AllowIndirectCustomers,它告诉我当值为true时,此项目可以使用其他客户。据我所知,大多数不同的SQL结构都是为了向结果集添加额外的列。我尝试了UNION命令的不同排列,没有运气。通常情况下,我会转向表值函数,但我无法使其适用于此场景。

这个对我来说是一个难题。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

所以基本上,你想要在设置标志时否定匹配pp.ProjectID = p.ProjectID的需要。您可以在JOIN条件中执行此操作:

JOIN Projects p
    ON pp.ProjectID = p.ProjectID OR p.AllowIndirectCustomers = 1

答案 1 :(得分:0)

根据表格的复杂程度,这可能不会太容易,但您可以在case列上执行bit声明。像这样:

select table1.id, table1.value, 
case table1.flag 
    when 1 then 
        table2.value
    else null
end as secondvalue
from table1
left join table2 on table1.id = table2.id

这是SQL Fiddle demo