2012-04-12 20 views
0

ist sagen, dass ich eine Tabelle wie folgt aus:SQL-Spalte in einer einzigen Zeile erhalten, die nicht Null

Tabellenname: Test

col1 | col2 | col3 | col4 
-------------------------- 
a | 0 | 0 | 1 

Ist es möglich, die Zeile, abrufen und nur die Spalte, ist nicht Null, ohne jede Spalte separat aufführen zu müssen?

Gibt es eine einfache Möglichkeit, nur die Zeile mit dem Wert 1 auszuwählen? Nur 1 Spalte hat einen Integer-Wert von 1 für jede Zeile.

Ich versuche, den Spaltennamen dieser einen Zeile, die nicht Null ist, zu erhalten. Die Spalten in dieser Tabelle werden größer, sodass ich nicht jeden Spaltennamen in meiner SQL-Anweisung aufführen muss. Ich benutze SQLite.

+0

Nicht unbedingt effizient, aber Sie könnten für jedes Feld im Schema eine Abfrage durchführen. – wachpwnski

+0

Ja, ich weiß, was du meinst, aber ich werde mehr Spalten zu diesem Tisch hinzufügen, also versuche ich das zu vermeiden. –

+0

welche SQL ... Sie haben sowohl MySQL und SQLite, geschweige denn SQL (SQL-Server, Oracle, und viele andere) – DRapp

Antwort

1

relationale Datenbanken sind für Operationen in Zeilen vorgesehen, nicht für Spalten. Spaltenoperationen sind daher sehr ineffizient. Vielleicht verwenden Sie eine falsche Herangehensweise an Ihr Problem. beachte das: Angenommen, du hast einen Weg gefunden, deine Situation zu lösen, was passiert, wenn mehr als eine "1" vorhanden ist? Was ist, wenn keine "1" vorhanden ist?

Dann nehme ich an, Sie wollen auch den Spaltennamen, der "1" Wert hat, also wo verwalten Sie es im Ergebnis zu speichern?

Ich empfehle Ihnen dringend, diese Informationen in einer anderen Tabelle zu speichern, damit Sie schnell erreichen können, was Sie wollen.

+0

Ich stimme @Kappa, scheint eine sehr seltsame Sache zu versuchen und zu tun. Vielleicht brauchen Sie eine Tabelle mit 2 Spalten - Name und Wert oder etwas und wählen Sie einfach diejenigen, die Wert> 0 waren. – Simon

+0

ja, ich sehe, was du meinst, das ist eine gute Idee –

0

Hat etwas erreicht, was Sie suchen?

create table Test 
(
    col1 nvarchar(100), 
    col2 int, 
    col3 int, 
    col4 int 
) 
insert into Test values('a', 1, 0, 0) 
insert into Test values('b', 0, 2, 0) 
insert into Test values('c', 0, 0, 3) 

select col1, val = case 
    when col2 > 0 then col2 
    when col3 > 0 then col3 
    when col4 > 0 then col4 
    end 
from test 
+0

eigentlich bin ich auf der Suche nach etwas mehr so: select (col2, col3, col4) wobei col1 = Wert und col2! = 0 und col3! = 0 und col4! = 0; aber ich möchte es tun, ohne jeden Spaltennamen aufschreiben zu müssen.Ich möchte nur die eine Spalte, die nicht Null ist in col2, col3, col4 –

+0

so müssen Sie Spalten auflisten, wenn Sie sie hinzufügen .. – kappa

+0

@ Kappa ja, aber Sie könnten diese SQL sql bei Bedarf dynamisch erstellen. – Simon

0

Eine Möglichkeit besteht darin, eine Schleife durch jede Spalte zu ziehen und zu bestimmen, ob der Wert in dieser Spalte für jede Zeile eins ist. Hier ist ein Beispiel, das Sie für Ihre Umgebung ändern können:

http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm

Sie müssen es auch um zwicken es mit SQLite zu arbeiten. Hier ist ein Zitat, das ich von einem Kerl gefunden, der genau das tat

landete ich es mit einigen Schleifen tun, indem zunächst das Array von Tabellennamen aus sqlite_master Tabelle ziehen und dann eine weitere Schleife, um durch jede Spaltenname, den ich aus dbCursor.description lösche. http://forums.fedoraforum.org/showthread.php?t=219441

Das wird ein turbulenter Prozess sein, aber es könnte Ihre Anforderungen. Wenn Sie nicht zu kompliziert wollen, könnten Sie so etwas tun:

SELECT 'Col1' AS Column 
FROM Table 
WHERE Col1 = 1 
UNION ALL 
SELECT 'Col2' AS Column 
FROM Table 
WHERE Col2 = 1 
etc. 

Das ist eine viel Handarbeit ist, und es wird, wie Sie Spalten werden müssen aktualisiert ändern, aber es kann für Sie einfacher sein .

+0

, die wahrscheinlich die Arbeit tun .. aber bist du sicher es ist eine Sache, die es wert ist? – kappa

+0

@kappa - Nun, es ist hässlich und es wird keine Geschwindigkeitsauszeichnungen gewinnen, aber das liegt wirklich an der Person, die es braucht. Alles hängt von den Umständen ab. Ich würde keine Datenbank mit diesem Plan entwerfen, aber wenn ich mit einem bestehenden System arbeiten müsste und ich diesen Bericht brauchen würde, würde ich das definitiv berücksichtigen. – IAmTimCorey

Verwandte Themen