1

Python スクリプトを使用して sqlite データベース テーブルをクエリしています。

SELECT servername, 
     date('now','localtime'),
     sum(CASE WHEN locked="NO" THEN 1 END),
     sum(CASE WHEN locked="YES" THEN 1 END) 
FROM nodes
WHERE servername="SOME_SERVER"

正常に動作します(サーバー名、今日の日付、ロック解除されたノードの数、ロックされたノードの数が表示されます)...

...クエリに一致するものがない場合を除きます(つまり、提供された名前のサーバー名がありません)。その場合、クエリ結果は

null,"2013-04-15",null,null

(わかりやすくするためにヌルを追加しました)

一部のサーバーがノードを持たないことは有効です。クエリから「ケース」を削除すると、クエリ結果が得られないため、結果が必要ないときに結果が得られます。

Pythonで検出したり、事前にカウントをクエリしたりせずに、SQLクエリで何も返さないようにするにはどうすればよいですか?

4

1 に答える 1

3

うーん、追加

group by servername

偶然発見したように、一致がない場合は空白行が消えます。これを説明するのに苦労しましたが、sqliteのドキュメントでこれがカバーされていると思います:

SELECT ステートメントが GROUP BY 句のない集計クエリである場合、結果セット内の各集計式はデータセット全体で 1 回評価されます。結果セット内の各非集計式は、データセットの任意に選択された行に対して 1 回評価されます。各非集計式には、任意に選択された同じ行が使用されます。または、データセットに含まれる行が 0 の場合、各非集計式は、完全に NULL 値で構成される行に対して評価されます。

結果セット内の集計式と非集計式を評価することによって作成された結果セット データの単一行は、GROUP BY 句を使用しない集計クエリの結果を形成します。GROUP BY 句のない集計クエリは、入力データの行がゼロであっても、常に 1 行のデータを返します。

于 2013-04-15T11:47:15.717 に答える