2009-06-24 6 views
25

Ich möchte eine gespeicherte Prozedur mit Parametern erstellen, die angeben, welche Felder ausgewählt werden sollten.SQL-Bedingung SELECT

z. Ich möchte zwei Parameter "selectField1" und "selectField2" jeweils als bools übergeben.

Dann möchte ich so etwas wie

SELECT 

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

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

FROM Table 

Dank Karl

Antwort

9

Klingt, als ob sie nur erlaubte Felder zurückgeben wollen, was bedeutet, dass die Anzahl der zurückgegebenen Felder auch dynamisch sein muss. Dies funktioniert mit 2 Variablen. Alles andere wird verwirrend werden.

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 

Dynamisches SQL hilft bei Multiples. Dieses Beispiel geht davon aus, dass mindestens 1 Spalte wahr ist.

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

Was ich tun möchte, ist eigentlich viel komplexer als nur die Auswahl von 1 oder zwei Felder. Ich habe eine Reihe von Feld, das ich dynamisch in der Lage sein müssen, wählen, sowie eine WHERE auf bestimmte Felder zu tun, zum Beispiel: @ whereField1 = 1 @ whereField2 = 1 @ whereField3 = 0 usw. und dann eine WHERE auf Feld1 nur wenn @ whereField1 = 1 usw. Es scheint mir, als ob Ihr zweites Beispiel die einzige Möglichkeit wäre, dies wirklich zu tun. Wie viele Zeichen ist Varchar (MAX) obwohl? – Karl

+0

SQL 2005 kann bis zu 8000 Zeichen speichern. –

+0

@ Justin varchar (max) in SQL2005 ist nicht auf 8000 Zeichen beschränkt. varchar (max) wurde in SQL 2005 als eine Art Ersetzung von Textdatentypen mit der Unterstützung von Funktionen eingeführt, die für varchar verfügbar sind. – kristof

48

In SQL, tun Sie es so:

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

Relationale Modell bedeutet nicht, dynamisches Feld zu zählen.

Wenn Sie nicht an einem Feldwert interessiert sind, wählen Sie stattdessen einfach eine NULL und analysieren sie auf dem Client.

+0

Das ist effizienter und sauber, aber was ist, wenn NULL ein gültiger möglicher Wert für ein Ihre optionalen Felder? Würden Sie die Feldnamen möglicherweise analysieren? – PapillonUK

15

Sie wollen die CASE statement:

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

EDIT: Mein Beispiel ist die zwei Felder in einem Feld zum Kombinieren, abhängig von den angegebenen Parametern. Es ist eine One-oder-weder Lösung (nicht beides). Wenn Sie beide Felder in der Ausgabe haben möchten, verwenden Sie Quassnois Lösung.

+0

Ich mache das oft, obwohl SQL Probleme beim Zwischenspeichern der Anweisungen hat, aber Sie können es nicht wirklich umgehen. – Kezzer

+0

Dies kann fehlschlagen, wenn die Spalten unterschiedlichen Typs sind, z. Int vs char – kristof

0

Dies ist ein psuedo Weg

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

es zu tun, was Sie wollen, ist:

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

in der Auswahl

, y Sie jedoch nicht nur nicht diese Spalte anzeigen in deinem Programm?

2
@selectField1 AS bit 
@selectField2 AS bit 

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

Ist das, was Sie suchen?

-1

Noob Weg, dies zu tun:

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

Sie können diese Informationen richtig an der Programmiersprache verwalten nur eine if-else zu tun.

Beispiel 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();