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?

Denys S.
quelle
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.

marc_s
quelle
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
Ed B.
quelle
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

Raja
quelle
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
Samim Hussain
quelle
7

Versuchen:

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

IF @@ROWCOUNT=0
BEGIN
    PRINT 'no rows!'
END
KM.
quelle
3
SELECT COUNT(1) FROM service s WHERE s.service_id = ?
ovais.tariq
quelle
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
Viranja kaushalya
quelle
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.

Donnie
quelle
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

csandreas1
quelle
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;

tpdi
quelle
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.

Sunil Kumar
quelle
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"
}

Karan Shrivastav
quelle
0
SELECT * FROM service s WHERE s.service_id = ?;
BEGIN
   print 'no data'
END
Sameera Lakshitha
quelle