2009-03-21 5 views
38

max(id)を使用してテーブル内にいくつかの行を取得したいとします。 NULLを返します - テーブルに行がない場合 - 0を返したいと思います。行があるときにはmax(id) + 1を返します。SQLite - データベース内の行数を取得する

私の行は0から自動番号が付けられています。ここで

は私の文は次のとおりです。

SELECT CASE WHEN MAX(id) != NULL THEN (MAX(id) + 1) ELSE 0 END FROM words 

しかし、それは常に私が間違って何をしている私には0を返していますか?

答えて

13

あなたの代わりにカウントMAX(id)を使用したい場合、私はあなたを理解していれば、次のSQLが何をしたい

SELECT COALESCE(MAX(id)+1, 0) FROM words 
+1

賢明ですが、基数0の自動int pkがある場合にのみ機能します。VolkerKの答えはより簡単で効果的です。 @Rich。 – Rich

+2

VolkerKの答えは本当に簡単で、自分で解決したい解決策ですが、OPはmax(id)を使いたいと言っていて、行は0から自動増加しました。 –

+1

真と真。ありがとう – Rich

8

を参照して、NULL = NULLは偽である

SELECT Count(*) FROM tblName
と実際の行数を照会することができ、あなたが通常使用する必要がNULL IS:

SELECT CASE WHEN MAX(id) IS NULL THEN 0 ELSE (MAX(id) + 1) END FROM words 

しかし、あなたがしたい場合あなたの行が(0,1,3,5,9)に与えなければならない場合、ソリューションが10を与えるので、count(id)を使用する必要があります。

0 〜N、max(id)+1 は、インデックスの実装に応じてより高速になります(ツリー全体をトラバースしてカウントするのではなく、バランスのとれたツリーの右側をトラバースするほうが速い場合があります)。

しかし、これは実装固有のものであり、パフォーマンスを特定のDBMSにロックするためではありません。

2

あなたを与えるだろうパックスからのコメントを読んだ後、私は同じ問題を抱えて問題は正しく、私は最後の挿入されたIDをSQLiteの操作ですべての挿入後に知りたい。私は次のステートメントを試しました:

select * from table_name order by id desc limit 1 

idはテーブル名の最初の列と主キーです。上記のステートメントは、最も大きなIDを持つレコードを表示します。

しかし、idの数が行の数に等しいので、あなたはどの行も決して削除しません。

4

私はあなたの質問を理解しているかどうかわかりませんが、max(id)は行数を全く与えません。たとえば、id = 13の行が1行しかない場合(前の行を削除したとします)、max(id)= 13になりますが、行数は1です。正しい(そして最も速い)解決策は、カウント()。なぜ星があるのだろうと思ったら、それは基準に基づいて線を数えることができるからです。 VolkerKの答えの

1

拡張、コードは少し読みやすくするために、あなたは、カウント、以下の例参照するためにとして使用することができます。たとえば、これはいくつかのフレームワークでははるかに簡単に読みになり

SELECT COUNT(*) AS c from profile

を私はExponent(React Native)Sqliteの統合を使用していますが、AS文がなければ、コードはかなり醜いです。

関連する問題