2009-06-24 19 views
25

Vorrei creare una stored procedure con parametri che indicano quali campi devono essere selezionati.SQL condizionale SELECT

E.g. Vorrei passare due parametri "selectField1" e "selectField2" come bool.

poi voglio qualcosa di simile

SELECT 

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

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

FROM Table 

Grazie Karl

risposta

9

Sembra che vogliano restituire solo i campi consentiti, il che significa che anche il numero di campi restituiti deve essere dinamico. Questo funzionerà con 2 variabili. Qualcosa di più sarà confuso.

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 dinamico aiuterà con i multipli. Questo esempio presuppone che la colonna atleast 1 sia vera.

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

Quello che voglio fare è in realtà molto più complesso della semplice scelta di selezionare 1 o 2 campi. Ho un sacco di campo che ho bisogno di essere in grado di selezionare in modo dinamico, così come fare un WHERE su alcuni settori, ad esempio: @ whereField1 = 1 @ whereField2 = 1 @ whereField3 = 0 ecc e quindi fare un WHERE su Field1 solo se @ whereField1 = 1 ecc. Mi sembra che il tuo secondo esempio potrebbe essere l'unico modo per farlo davvero. Quanti caratteri è varchar (MAX)? – Karl

+0

SQL 2005 può memorizzare fino a 8000 caratteri. –

+0

@Justin varchar (max) in SQL2005 non è limitato a 8000 caratteri. varchar (max) è stato introdotto in SQL 2005 come una sorta di sostituzione del tipo di dati di testo con il supporto delle funzioni disponibili per varchar. – kristof

48

In SQL, si fa in questo modo:

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

modello relazionale non implica conteggio campo dinamico.

Invece, se non si è interessati a un valore di campo, è sufficiente selezionare uno NULL e analizzarlo sul client.

+0

Questo è più efficiente e pulito, ma cosa succede se NULL è un valore valido possibile per uno dei tuoi campi opzionali? Vuoi analizzare i nomi dei campi, forse? – PapillonUK

15

si desidera che il CASE statement:

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

EDIT: Il mio esempio è per combinare i due campi in un campo, a seconda dei parametri forniti. È una soluzione una o nessuna delle due (non entrambe). Se vuoi la possibilità di avere entrambi i campi nell'output, usa la soluzione di Quassnoi.

+0

Lo faccio spesso, anche se SQL ha problemi a memorizzare le istruzioni nella cache, ma non puoi davvero aggirarlo. – Kezzer

+0

Ciò potrebbe non riuscire se le colonne sono di tipo diverso ad es. int vs char – kristof

0

questo è un modo di farlo pseudo

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

quello che vuoi è:

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

nel selezionare

Tuttavia, y Non non basta mostrare quella colonna nel tuo programma?

2
@selectField1 AS bit 
@selectField2 AS bit 

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

E 'questo quello che stai cercando?

-1

Il modo niubbo per fare questo:

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

È possibile gestire le informazioni correttamente al linguaggio di programmazione solo facendo un if-else.

Esempio in ASP/JavaScript

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