2

学校のプロジェクトとしてテーブルジェネレーターを作っています。MySQLには、プロセス、操作、スコアの3つのテーブルがあります。Webアプリの[列を追加]ボタンをテストするまで、すべてが正常に見えました。以前に保存されたデータは正しく読み取られる必要がありますが、形式に新しい列も含まれている必要があります。問題は、クエリされた以前のデータに新しいテーブルの値が含まれていないため、レコードが見つからなかった場合にスコア0を返すことを意図して試してみましたIFNULL&COALESCEですが、何も起こりません(多分それを間違って使用しているだけです)

  • プロセス-processID、processName
  • operation-operationID、operationName
  • スコア-scoreID、score、processID、operationID、scoreType(スコアタイプはSELF、GL、FINAL)

    ps =(PreparedStatement)dbconn.prepareStatement("SELECTスコアFROMスコアWHEREプロセスID=?および操作ID =?およびタイプ=?ORDER BYプロセスID");

これが小さなサンプルの写真ですhttp://i50.tinypic.com/2yv3rf9.jpg

4

1 に答える 1

5

IFNULL機能しない理由は、値にのみ影響があるためです。行のない結果セットには値がないため、何もしません。

まず、これはサーバー上よりもクライアント上で行う方がよいでしょう。しかし、サーバー上で行う必要がある場合は、いくつかの方法が考えられます。

これを試して:

SELECT IFNULL(SUM(score), 0) AS score
FROM score
WHERE processID=? and operationID=? and type=?
ORDER BY processid

SUM、正確に 1 行が返されることを保証します。

テーブルに複数の一致する行が含まれているときに複数の行を返す必要がある場合は、これを使用できます (簡単にするために ORDER BY を省略しています)。

SELECT score
FROM score
WHERE processID = ? and operationID = ? and type = ?

UNION ALL

SELECT 0
FROM (SELECT 0) T1
WHERE NOT EXISTS
(
    SELECT *
    FROM score
    WHERE processID = ? and operationID = ? and type = ?
)
于 2012-05-12T06:00:11.903 に答える