2009-03-14 31 views
20

Có thể sử dụng câu lệnh Case trong mệnh đề sql From sử dụng SQL 2005 không? Ví dụ, tôi đang cố gắng một cái gì đó như:Có thể sử dụng câu lệnh Case trong mệnh đề sql From

SELECT Md5 FROM 
CASE 
    WHEN @ClientType = 'Employee' THEN @Source = 'HR' 
    WHEN @ClientType = 'Member' THEN @Source = 'Other' 
END CASE 
WHERE Current = 2; 

Trả lời

6

Giả sử SQL Server:

Bạn cần sử dụng SQL động. Xây dựng chuỗi và sau đó gọi sp_executesql với chuỗi.

Chỉnh sửa: Tốt hơn, chỉ cần sử dụng nếu câu lệnh để thực thi câu lệnh thích hợp và gán giá trị cho biến. Bạn nên tránh SQL động nếu có thể.

0

Vì bạn không chỉ định những gì phụ trợ SQL bạn đang đi ngược lại, điều này sẽ rất khó để trả lời đúng ....

As far as Tôi có thể nói, bạn sẽ không thể làm điều này không chống lại MS SQL Server, cũng không phải chống lại Interbase/Firebird. Tôi không thể nói cho các máy chủ backend khác, mặc dù ...

Marc

0

Tôi nghĩ nó khá an toàn để nói câu trả lời là không có cách nào. Và đó là bất kể phương ngữ SQL.

22

Tôi không tin điều đó là có thể. Đối với một điều, tối ưu hóa truy vấn giả định một danh sách cụ thể của những thứ giống như bảng trong mệnh đề FROM.

Cách giải quyết đơn giản nhất mà tôi có thể nghĩ đến sẽ là một UNION giữa hai bảng:

SELECT md5 
FROM hr 
WHERE @clienttype = 'Employee' 
AND  current = 2 
UNION 
SELECT md5 
FROM other 
WHERE @clienttype = 'Member' 
AND  current = 2; 

Chỉ một nửa số UNION có thể là True, trao @clienttype vị.

+0

Tôi thường sẽ viết một câu lệnh if, nhưng khi sử dụng chiến lược này kết hợp với một 'chèn vào' nó tiết kiệm cho tôi khỏi phải viết phần chèn nhiều lần, yêu thích giải pháp này nhờ, sẽ được làm theo cách này từ bây giờ khi có thể. :) –

+0

Chỉ cần lưu ý rằng điều kiện 'WHERE' được thực hiện cho mỗi hàng trong bảng. Vì vậy, nó có thể không phải là một lựa chọn nếu điều kiện là một chút phức tạp hơn và có hàng triệu hàng. –

1

Không, bạn không thể chọn một bảng để truy vấn bằng cách sử dụng câu lệnh CASE. Các câu lệnh CASE chỉ đi trong các biểu thức, chẳng hạn như cho một giá trị của cột hoặc là một phần của biểu thức WHERE của bạn.

này nên làm điều đó, nếu bạn đang tìm kiếm chỉ là một giá trị:

IF @ClientType = 'Employee' BEGIN 
    SET @Source = (SELECT Md5 FROM HR WHERE Current = 2) 
END 
ELSE IF @ClientType = 'Member' BEGIN 
    SET @Source = (SELECT Md5 FROM Other WHERE Current = 2) 
END 
+0

Là "tay dài" như thế này, đó là cách tiếp cận tôi muốn (nhưng không có phiếu bầu nào: - /). Tôi muốn sử dụng một công cụ để tạo SQL tĩnh (đó là cái gì, 3 dòng của Ruby hoặc 1 dòng Perl? :-) so với giao dịch với SQL động (khi tôi _need_ SQL động), tôi không tìm thấy gì ngoài việc ghê tởm cần SQL động). –

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