Einfache Überprüfung auf leeres Ergebnis der SELECT-Abfrage


71

Kann jemand darauf hinweisen, wie zu überprüfen ist, ob eine ausgewählte Abfrage eine nicht leere Ergebnismenge zurückgibt?

Zum Beispiel habe ich nächste Abfrage:

SELECT * FROM service s WHERE s.service_id = ?;

Soll ich so etwas wie nächstes machen:

ISNULL(SELECT * FROM service s WHERE s.service_id = ?)

um zu testen, ob die Ergebnismenge nicht leer ist?


Was versuchst du zu machen? Was werden Sie nach der Überprüfung als Nächstes tun?
Mark Byers

Es ist nicht klar, ob Sie eine Ergebnismenge zurückgeben möchten und dann prüfen möchten, ob Zeilen darin enthalten sind, oder ob Sie nur überprüfen möchten, ob eine Abfrage Zeilen ohne Ergebnismenge zurückgibt.
KM.

1
Ich möchte wissen, ob eine Ergebnismenge Zeilen enthält.
Denys S.

Antworten:


93

Verwenden Sie @@ ROWCOUNT:

SELECT * FROM service s WHERE s.service_id = ?;

IF @@ROWCOUNT > 0 
   -- do stuff here.....

Laut SQL Server Books Online :

Gibt die Anzahl der Zeilen zurück, die von der letzten Anweisung betroffen sind. Wenn die Anzahl der Zeilen mehr als 2 Milliarden beträgt, verwenden Sie ROWCOUNT_BIG.


7
Das ist ganz einfach, ich mag es. Und das habe ich gesucht. Vielen Dank.
Denys S.

Es ist erwähnenswert, dass @@ ROWCOUNT nur in Transact-SQL
MatrixManAtYrService

1
@MatrixManAtYrService: ja - diese Frage IS über SQL Server , die T-SQL verwendet ....
marc_s

Feldwert ist NULL, aber @@ ROWCOUNT gibt 1 zurück! Verwirrend: |
QMaster

Natürlich gibt es 1 zurück! Wenn eine Zeile zurückgegeben wird, spielt es keine Rolle, wie die Spalten der Zeile aussehen. Eine Spalte mit dem Wert Null kann wertvolle Informationen sein.
Schnaps vor

109
IF EXISTS(SELECT * FROM service s WHERE s.service_id = ?)
 BEGIN
   --DO STUFF HERE

 END

4
Ändern Sie 'SELECT *' aus Effizienzgründen in 'SELECT TOP 1 *'
Ed B

18
@Ed B: Es spielt keine Rolle, da EXISTS beim ersten erfolgreichen Match true zurückgibt. Test mit EXISTS (SELECT 1/0 FROM SERVICE...- es sollte ein kann nicht durch Null teilen, aber es wird nicht
OMG Ponys

1
@Ed B & @OMG Ponies, ja, ich glaube , SQL Server ist intelligent genug, das zu optimieren EXISTS (SELECT *oder EXISTS (SELECT 1oder EXISTS (SELECT 1/0entfernt
KM.

1
@OMG Ponies, @KM - Der einzige Grund, warum ich meinen Entwicklern die Verwendung von Select 1 sage, besteht darin, die Suche zu vereinfachen, um die Verwendung von Select * zu unterdrücken. Außerdem bin ich in anderen Datenbanken als SQL Server (Husten Access Husten) auf Effizienzprobleme gestoßen, bei denen aus irgendeinem dummen Grund etwas mit der Select-Klausel geschehen ist.
Thomas

1
Ich kann feststellen, dass dies besser ist als die akzeptierte Antwort, wenn Sie nur testen möchten, ob sie leer ist und keine Ergebnismenge zurückgeben möchten, z. B. wenn Sie in einem gespeicherten Prozess noch kein Ergebnis zurückgeben möchten.
Mike M

11

Ich stimme Ed B zu. Sie sollten die EXISTS-Methode verwenden, aber ein effizienterer Weg, dies zu tun, ist:

IF EXISTS(SELECT 1 FROM service s WHERE s.service_id = ?)
BEGIN
   --DO STUFF HERE

END

HTH


15
Wenn Sie zustimmen, sollten Sie für diese Antwort stimmen. Anstatt identischen Inhalt erneut zu veröffentlichen ...
OMG Ponys

1
@ OMG Ponys: Es ist nicht identisch. Er änderte das * in ein 1.
Mark Byers

1
Nun, die Verwendung von "(SELECT TOP 1 * ..." wäre effizienter als die Verwendung von "SELECT 1 ..."
Ed B

5
Ich erhalte identische Abfragepläne mit SET SHOWPLAN_ALL ONfor IF EXISTS (SELECT * FROM ...und IF EXISTS (SELECT 1 FROM ...
KM.

10

Sie können dies auf verschiedene Arten tun.

IF EXISTS(select * from ....)
begin
 -- select * from .... 
end
else
 -- do something 

Oder Sie können IF NOT EXISTS , @@ROW_COUNTwie verwenden

select * from ....
IF(@@ROW_COUNT>0)
begin
-- do something
end

7

Versuchen:

SELECT * FROM service s WHERE s.service_id = ?;

IF @@ROWCOUNT=0
BEGIN
    PRINT 'no rows!'
END

3
SELECT COUNT(1) FROM service s WHERE s.service_id = ?

3
Gibt es einen Unterschied zur Anzahl (*)?
Liang

2
SELECT * FROM service s WHERE s.service_id = ?;
IF @@rowcount = 0
begin
select 'no data'
end

1

Um die folgenden Beiträge ein wenig zusammenzufassen:

Wenn Sie sich nur darum kümmern, ob sich mindestens eine übereinstimmende Zeile in der Datenbank existsbefindet, ist dies die effizienteste Methode, um dies zu überprüfen: Es wird true zurückgegeben, sobald mindestens eine übereinstimmende Zeile gefunden wirdcount usw. alle übereinstimmenden findet Reihen.

Wenn Sie die Daten tatsächlich für die Verarbeitung verwenden müssen oder wenn die Abfrage Nebenwirkungen hat oder wenn Sie die tatsächliche Gesamtzahl der Zeilen kennen müssen, ist die Überprüfung des ROWCOUNToder countwahrscheinlich der beste Weg.


1

SELECT count(*) as CountThis ....

Dann können Sie es als Zeichenfolge wie folgt vergleichen:

IF CHECKROW_RS("CountThis")="0" THEN ...

CHECKROW_RS ist ein Objekt


0
SELECT count(*) as count FROM service s WHERE s.service_id = ?;

teste ob count == 0 ist.

Barocker:

Wählen Sie den Fall aus, wenn (SELECT count (*) als count FROM service s WHERE s.service_id =?) = 0, dann 'No rows, bro!' sonst 'Du hast Daten! "ende als dumme_nachricht;


0

Verwenden Sie in meinem SQL die Informationsfunktion

select FOUND_ROWS();

es wird die Nr. zurückgeben. Anzahl der von der Auswahlabfrage zurückgegebenen Zeilen.


0

Nun, es gibt eine Möglichkeit, etwas mehr Code zu machen, aber wirklich effektiv

$sql = "SELECT * FROM messages";  //your query
$result=$connvar->query($sql);    //$connvar is the connection variable
$flag=0;
     while($rows2=mysqli_fetch_assoc($result2))
    { $flag++;}
    
if($flag==0){no rows selected;}
else{
echo $flag." "."rows are selected"
}


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.