2009-06-24 47 views
25

Tôi muốn tạo một thủ tục lưu sẵn với các tham số cho biết trường nào sẽ được chọn.SQL có điều kiện SELECT

Ví dụ: Tôi muốn chuyển hai tham số "selectField1" và "selectField2" mỗi tham số như bools.

Sau đó, tôi muốn một cái gì đó giống như

SELECT 

if (selectField1 = true) Field1 ELSE do not select Field1 

if (selectField2 = true) Field2 ELSE do not select Field2 

FROM Table 

Cảm ơn Karl

Trả lời

9

Có vẻ như họ muốn khả năng chỉ trả về các trường được phép, có nghĩa là số lượng trường được trả lại cũng phải là động. Điều này sẽ làm việc với 2 biến. Bất cứ điều gì nhiều hơn thế sẽ trở nên khó hiểu.

IF (selectField1 = true AND selectField2 = true) 
BEGIN 
    SELECT Field1, Field2 
    FROM Table 
END 
ELSE IF (selectField1 = true) 
BEGIN 
    SELECT Field1 
    FROM Table 
END 
ELSE IF (selectField2 = true) 
BEGIN 
    SELECT Field2 
    FROM Table 
END 

SQL động sẽ trợ giúp với bội số. Ví dụ này giả định rằng ít nhất 1 cột là đúng.

DECLARE @sql varchar(MAX) 
SET @sql = 'SELECT ' 
IF (selectField1 = true) 
BEGIN 
    SET @sql = @sql + 'Field1, ' 
END 
IF (selectField2 = true) 
BEGIN 
    SET @sql = @sql + 'Field2, ' 
END 
... 
-- DROP ', ' 
@sql = SUBSTRING(@sql, 1, LEN(@sql)-2) 

SET @sql = @sql + ' FROM Table' 

EXEC(@sql) 
+0

Điều tôi muốn làm thực sự phức tạp hơn rất nhiều so với việc chỉ chọn 1 hoặc 2 trường. Tôi có một loạt các lĩnh vực mà tôi cần để có thể tự động lựa chọn, cũng như làm một WHERE trên các lĩnh vực nhất định, ví dụ: @ whereField1 = 1 @ whereField2 = 1 @ whereField3 = 0 , vv và sau đó làm một WHERE trên Field1 chỉ khi @ whereField1 = 1 vv Dường như với tôi như ví dụ thứ hai của bạn có thể là cách duy nhất để thực sự làm điều này. Mặc dù có bao nhiêu ký tự là varchar (MAX)? – Karl

+0

SQL 2005 có thể lưu trữ tới 8000 ký tự. –

+0

@Justin varchar (tối đa) trong SQL2005 không giới hạn ở 8000 ký tự. varchar (max) đã được giới thiệu trong SQL 2005 như một số loại thay thế kiểu dữ liệu văn bản với sự hỗ trợ của các hàm sẵn dùng cho varchar. – kristof

48

Trong SQL, bạn làm điều đó theo cách này:

SELECT CASE WHEN @selectField1 = 1 THEN Field1 ELSE NULL END, 
     CASE WHEN @selectField2 = 1 THEN Field2 ELSE NULL END 
FROM Table 

mô hình quan hệ nào không bao hàm count lĩnh vực năng động.

Thay vào đó, nếu bạn không quan tâm đến giá trị trường, bạn chỉ cần chọn NULL thay vào đó và phân tích cú pháp trên máy khách.

+0

Đây là hiệu quả hơn và sạch sẽ, nhưng những gì nếu NULL là một giá trị hợp lệ có thể cho một trong những lĩnh vực tùy chọn của bạn? Bạn sẽ phân tích các tên trường có thể? – PapillonUK

15

Bạn muốn CASE statement:

SELECT 
    CASE 
    WHEN @SelectField1 = 1 THEN Field1 
    WHEN @SelectField2 = 1 THEN Field2 
    ELSE NULL 
    END AS NewField 
FROM Table 

EDIT: Ví dụ của tôi là để kết hợp hai lĩnh vực vào một lĩnh vực, tùy thuộc vào các thông số được cung cấp. Đây là một giải pháp một hoặc không (không phải cả hai). Nếu bạn muốn có khả năng có cả hai trường trong đầu ra, hãy sử dụng giải pháp của Quassnoi.

+0

Tôi làm điều này thường xuyên, mặc dù SQL có vấn đề trong bộ nhớ đệm các câu lệnh nhưng bạn không thể thực sự có được xung quanh nó. – Kezzer

+0

Điều đó có thể thất bại nếu các cột có loại khác nhau, ví dụ: int vs char – kristof

0

Đây là một cách psuedo làm việc đó

IF (selectField1 = true) 
SELECT Field1 FROM Table 
ELSE 
SELECT Field2 FROM Table 
0

những gì bạn muốn là:

MY_FIELD= 
     case 
      when (selectField1 = 1) then Field1 
           else Field2   
     end, 

trong chọn

Tuy nhiên, y không bạn chỉ không hiển thị cột đó trong chương trình của bạn?

2
@selectField1 AS bit 
@selectField2 AS bit 

SELECT 
CASE 
    WHEN @selectField1 THEN Field1 
    WHEN @selectField2 THEN Field2 
    ELSE someDefaultField 
END 
FROM Table 

Đây có phải là những gì bạn đang tìm kiếm?

-1

Cách Noob để làm điều này:

SELECT field1, field2 FROM table WHERE field1 = TRUE OR field2 = TRUE 

Bạn có thể quản lý thông tin này đúng ở ngôn ngữ lập trình chỉ làm một if-else.

Ví dụ trong ASP/JavaScript

// Code to retrieve the ADODB.Recordset 
if (rs("field1")) { 
    do_the_stuff_a(); 
} 
if (rs("field2")) { 
    do_the_stuff_b(); 
} 
rs.MoveNext();