0

電話番号とカウンターの 2 つの列を持つシンプルな Sqlite テーブルがあります。電話番号とカウンターも含む .csv ファイルに基づいてテーブルを更新したいと考えています。数値がデータベースに存在する場合は、既存のカウンター + ファイル内のカウンターの合計によって更新する必要があります。存在しない場合は、ファイルの値を使用して新しいレコードを挿入する必要があります。残っている問題の 1 つは、電話番号の最初の桁が 0 になっていることです。データベースにデータを入力すると、ゼロが保持されます (09999 のような既存の番号を手動で選択して見つけることができます)。先行ゼロなしで新しいレコードを挿入するため、0999 はデータベースで 999 になります。先行ゼロのない数値は正しく処理されます。

rowArray=thisFile[k].split(';')
number = rowArray[0]
couplings = rowArray[1]


updString="INSERT OR REPLACE INTO Caller (Telno,count) VALUES (#{number},COALESCE((SELECT count + #{couplings} FROM Caller WHERE Telno=#{number}),#    {couplings}))"

db.execute(updString)

ここで何が間違っているのか分かりますか?最も簡単な解決策は、先頭のゼロを削除することですが、私はそれを正しく行うことを好みます。よろしくお願いします。

4

1 に答える 1

0

呼び出しでプレースホルダーを使用し、prepare呼び出しで実際の値を に渡す必要がありますexecute。このような

insert = db.prepare(<<__SQL__)
INSERT OR REPLACE INTO Caller (Telno, count)
VALUES (:number, COALESCE((SELECT count + :couplings FROM Caller WHERE Telno = :number), :couplings))
__SQL__

insert.execute(number: number, couplings: couplings)

( SQL ステートメント内の:numberandはplaceholders という名前であることに注意してください。それらは何でもかまいませんが、バインドされる変数の対応する名前と一致するようにそれらを選択しました。):couplings

問題は、単純な補間を使用すると、次のような文字列になることです

INSERT OR REPLACE INTO Caller (Telno, count) VALUES (0999, ...

0999は、文字列ではなく数値のように見えます。文字列を渡すとexecute、変数は正しい型にバインドされます。

于 2013-07-29T14:46:24.147 に答える