如何使用不同的where子句条件从同一个表中选择列

时间:2015-06-12 07:10:39

标签: sql-server

我有一张类似于下面设计的表格:

Id   Code     Name    short name     Date1       date2       market
1    12A      AAAA1    a1            2012-03-27  2012-03-27  90
2    13A      AAAA2    a2            2012-03-28  2012-03-28  90
3    14A      AAAA3    a3            NULL        NULL        32
4    15A      AAAA4    a4            NULL        NULL        32

我必须构建一个查询,这样当我选择代码时,代码与市场90一样,select应该是这样一种方式,即Date1>系统日期和Date2> Date1和其他市场没有标准适用于选择。

到目前为止我已构建了查询,但我不知道如何在市场为90时指定where子句。

SELECT A.Id, B.Name [Name], B.Code [Code], Date1 [Date1], Date2 [Date]2, C.Code[Market]
FROM dbo.fn_idlisting(@System_Date) A 
INNER JOIN code B ON A.Id = B.Id 
LEFT OUTER JOIN Market C ON B.Market_Id = C.Market_Id 
WHERE (Date1 <= @systemDate) AND (Date2 >= Date1)

我觉得如何在没有任何where子句的情况下选择市场32的其他代码很困难。

3 个答案:

答案 0 :(得分:1)

你能这样试试吗

SELECT A.Id, B.Name [Name], B.Code [Code], Date1 [Date1], Date2 [Date]2, C.Code[Market] 
    FROM dbo.fn_idlisting(@System_Date) A 
    INNER JOIN code B ON A.Id = B.Id
    LEFT OUTER JOIN Market C ON B.Market_Id = C.Market_Id 
    WHERE (Date1 > @System_Date and Date2 >Date1 or c.Code != 90)

答案 1 :(得分:0)

使用CASE语句包含您的Market = 90逻辑,如下所示:

SELECT
  A.Id,
  B.Name [Name],
  B.Code [Code],
  Date1 [Date1],
  Date2 [Date2],
  C.Code [Market]
FROM
  dbo.fn_idlisting(@System_Date) A
  INNER JOIN code B
    ON A.Id = B.Id
  LEFT OUTER JOIN Market C
    ON B.Market_Id = C.Market_Id
WHERE
  Date1 <= CASE WHEN C.Code = 90 THEN @systemDate ELSE Date1 END 
  AND 
  Date2 >= CASE WHEN C.Code = 90 THEN Date1 ELSE Date2 END

答案 2 :(得分:0)

我从您的问题中了解到,您的表名是fn_idlisting,而您只有一个表。请尝试以下。

注意:我没有使用等于你只提及&gt;和&lt;对于date1和date2,如果想要更改日期范围标准,可以使用它。

select * from fn_idlisting 
where market=90 and date1>cast(SYSDATETIME() as DATE)
and date2>date1
union
select * from fn_idlisting 
where market<>90