2017-01-04 10 views
1

ich die folgende SQL-Anweisung haben:Überprüfen Sie, ob Spaltenwert vorhanden ist, bevor SELECT

SqlCommand myCmd = new SqlCommand("select distinct(year(date_created)) as theYear from content where folder_id = 1 or folder_id = 2 order by theYear desc", myConn); 

Diese Anweisung überprüft Ordner für den Inhalt dann einen Tropfen Satzliste nach unten um das Jahr zu entsprechen. Wenn jedoch kein Inhalt in einem dieser Ordner vorhanden ist, wird die Anweisung abgebröckelt. Dies geschieht scheinbar jedes Jahr, wenn noch kein Inhalt erstellt wurde. Die einfache Antwort besteht darin, lediglich einen Teil des Inhalts zu erstellen, der das Problem behebt. Ich möchte sicherstellen, dass es so eingerichtet ist, dass sich niemand darum kümmern muss, falls etwas schief geht. Also, gibt es eine Möglichkeit zu überprüfen, ob es einen Wert in dieser Spalte gibt, bevor es versucht, auszuwählen.

Ich habe versucht, die folgenden:

SELECT DISTINCT (ISNULL(year(date_created), year(getdate()))) AS theYear 
FROM content 
WHERE folder_id = 1 
    OR folder_id = 2 
ORDER BY theYear DESC 

, die nicht zu arbeiten schien. Ich habe auch das COUNT versucht, aber entweder war meine Syntax falsch oder ich benutzte es falsch.

Kann mir jemand sagen, wo ich falsch gelaufen bin und was die richtige Methode wäre?

+2

Nicht verwandt, aber: 'distinct' ist ** NOT ** eine Funktion. Benutze es nicht wie einen. –

+2

Wie Sie Drop-down zuweisen, können Sie nicht die Logik dort überprüfen – TheGameiswar

+0

@a_horse_with_no_name Danke für die Klarstellung! Das war der Code, den ich dort hatte, als ich ihn bekam, und ich wusste nicht, dass es unpassend war. –

Antwort

0

Ihre aktualisierte Anweisung wird weiterhin die WHERE-Klausel anwenden, die die Rückgabe von Datensätzen verhindert, NULL oder anderweitig.

select distinct 
    (ISNULL(year(date_created), year(getdate()))) as theYear 
from content 
where folder_id = 1 
    or folder_id = 2 
order by theYear desc 

Versuchen Sie es zu

DECLARE @yearTbl TABLE 
(
    date_created DATE 
) 

INSERT @yearTbl 
SELECT date_created 
FROM content 
WHERE folder_id = 1 
    OR folder_id = 2 

IF (SELECT count(*) FROM @yearTbl) = 0 
    SELECT year(getdate()) AS theYear 
ELSE 
    SELECT DISTINCT year(date_created) AS theYear 
    FROM @yearTbl 
    ORDER BY theYear 
+0

Mit deiner Antwort habe ich die Frage besser verstanden. Ist es möglich, dasselbe in nur einer SELECT-Anweisung zu tun? – JotaPardo

1

Ändern können Sie nur UNION verwenden auf dem Datensatz des laufenden Jahres zu heften. Da UNION Duplikate entfernt ist es egal, ob es existiert bereits in Content:

SELECT YEAR(date_created) AS theYear 
FROM Content 
WHERE folder_id IN (1, 2) 
UNION 
SELECT YEAR(GETDATE()) 
ORDER BY theYear DESC; 

Wenn Sie nur das aktuelle Jahr angezeigt werden soll, wenn keine Daten vorhanden sind, dann können Sie in der zweiten Abfrage setzen und EXISTS-Check:

SELECT YEAR(date_created) AS theYear 
FROM Content 
WHERE folder_id IN (1, 2) 
UNION 
SELECT YEAR(GETDATE()) 
WHERE NOT EXISTS (SELECT 1 FROM Content WHERE folder_id IN (1, 2)) 
ORDER BY theYear DESC; 
+1

Und wenn es Daten in date_created hat, aber das aktuelle Jahr existiert nicht in den Daten? Ich verstehe, dass nur das aktuelle Datum angezeigt werden sollte, wenn keine Daten vorhanden sind. – JotaPardo

+1

@JotaPardo OK, ich glaube, ich habe es falsch verstanden. Ich habe der ursprünglichen Abfrage eine WHERE-Klausel hinzugefügt, um sicherzustellen, dass sie nur dort angezeigt wird, wo keine Daten vorhanden sind. – GarethD

+0

@GarethD Ihre erste Aussage war die, die für mich funktionierte. Es fügte 2017 der Liste hinzu und mischte sich nicht in irgendwelche der vorhergehenden Jahre ein, die dort sein sollten. Vielen Dank! –

Verwandte Themen