2012-01-04 38 views
18

Tôi đang cố gắng thêm một trường hợp hoặc nếu câu lệnh trong mệnh đề where của truy vấn SQL của tôi.
Tôi có một bảng thời gian hành trình với ngày bắt đầu và ngày kết thúc và trường boolean cho mỗi ngày để biểu thị nơi hành trình xảy ra vào ngày đó. Dưới đây là những gì tôi có cho đến nay, nhưng tôi nhận được lỗi cú pháp không chính xác:tuyên bố trường hợp trong mệnh đề where - SQL Server

declare @date datetime 
set @Date = '05/04/2012' 
declare @day nvarchar(50) 
set @day = 'Monday' 

Select * From Times 
WHERE (StartDate <= @Date) AND (EndDate >= @Date) 
CASE WHEN @day = 'Monday' THEN 
AND (Monday = 1) 
WHEN @day = 'Tuesday' THEN 
AND (Tuesday = 1) 
ELSE 
AND (Wednesday = 1) 
END 
+2

Trông với tôi như thể bạn có vấn đề về thiết kế trên bàn, Không có cách nào bạn nên có cột Thứ hai, thứ ba, thứ tư, vv Bạn shoudlhavea daya cột và cư nó với ngày bạn muốn hoặc một giá trị số đó là một tra cứu cho ngày ayou muốn. Nếu có nhiều hơn một ngày được áp dụng, sau đó sử dụng một bảng liên quan. – HLGEM

Trả lời

47

Bạn không cần case trong báo cáo where, chỉ cần sử dụng dấu ngoặc đơn và or:

Select * From Times 
WHERE StartDate <= @Date AND EndDate >= @Date 
AND (
    (@day = 'Monday' AND Monday = 1) 
    OR (@day = 'Tuesday' AND Tuesday = 1) 
    OR Wednesday = 1 
) 

Bên cạnh đó, cú pháp của bạn là sai đối với một trường hợp. Nó không nối thêm vào chuỗi - nó trả về một giá trị duy nhất. Bạn muốn một cái gì đó như thế này, nếu bạn đã thực sự sẽ sử dụng một tuyên bố case (mà bạn không nên):

Select * From Times 
WHERE (StartDate <= @Date) AND (EndDate >= @Date) 
AND 1 = CASE WHEN @day = 'Monday' THEN Monday 
      WHEN @day = 'Tuesday' THEN Tuesday 
      ELSE Wednesday 
     END 

Và chỉ dành riêng cho một umph thêm, bạn có thể sử dụng toán tử between cho ngày của bạn:

where @Date between StartDate and EndDate 

làm truy vấn cuối cùng của bạn:

select 
    * 
from 
    Times 
where 
    @Date between StartDate and EndDate 
    and (
     (@day = 'Monday' and Monday = 1) 
     or (@day = 'Tuesday' and Tuesday = 1) 
     or Wednesday = 1 
    ) 
+0

Cảm ơn Eric - đó là hoàn hảo :) –

+0

@Eric Điều này sẽ làm chậm truy vấn –

5

chỉ đơn giản là làm select:

Select * From Times 
WHERE (StartDate <= @Date) AND (EndDate >= @Date) AND 
((@day = 'Monday' AND (Monday = 1)) 
OR (@day = 'Tuesday' AND (Tuesday = 1)) 
OR (Wednesday = 1)) 
+1

Sẽ là vô ích nếu tôi downvote bạn, nhưng bạn có thể sử dụng 'case' trong mệnh đề' where'. Bạn không thể sử dụng nó như OP đang cố gắng làm. – Eric

+1

Trong Microsoft SQL Server, bạn thực sự có thể sử dụng một 'CASE' trong mệnh đề' WHERE'. Hãy thử điều này - phân tích cú pháp & thực hiện tốt (trên SQL 2008 R2): "select * from sys.tables t trong trường hợp khi t.schema_id = 1 rồi 1 else 0 end = 1" – jklemmack

+0

@Eric thanks then :) cố định: P –

1

Tuyên bố CASE là một biểu thức, giống như so sánh boolean. Điều đó có nghĩa là 'VÀ' cần phải đi trước câu lệnh 'CASE', không phải trong câu đó:

Select * From Times 
WHERE (StartDate <= @Date) AND (EndDate >= @Date) 

AND -- Added the "AND" here 

CASE WHEN @day = 'Monday' THEN (Monday = 1) -- Removed "AND" 
    WHEN @day = 'Tuesday' THEN (Tuesday = 1) -- Removed "AND" 
    ELSE AND (Wednesday = 1) 
END 
+0

Thx để chỉnh sửa Dylan. Tôi phải đã được channeling VB sáng nay. – jklemmack

+2

Xin chào jklemmack, tôi đã thử điều này ban đầu và nhận được một lỗi "sai cú pháp gần '='" trong dòng trên cùng của tuyên bố trường hợp. Vẫn nhận được điều đó khi tôi thực hiện truy vấn này –

Các vấn đề liên quan