4

私はこれで2時間苦しんでいます。レコードを選択または挿入したい。レコードが存在する場合は、彼の ID を選択し、そうでない場合はそれを挿入し、新しく挿入された ID を取得します。今のところ、これを実行しようとしていますが、まだエラーが発生します

SELECT CASE WHEN (SELECT COUNT(*) FROM Domains WHERE Domain = @domain)>0 
THEN 
    (SELECT Domain_ID FROM Domains WHERE Domain = @domain) 
ELSE        
    INSERT INTO Domains(Domain_ID,Domain,Disabled,Description) VALUES(@Domain_ID,@Domain,@Disabled,@Description);
4

2 に答える 2

6

ケースに End がありません

Case when (something) then (Some)
else (another thing) end

とにかく、else は select を返す必要があります。insert は何も返しません。存在しない場合に挿入し、挿入された値を返す (または存在する場合は返す) 場合は、次のようにします。

INSERT INTO Domains(Domain_ID,Domain,Disabled,Description) VALUES(@Domain_ID,@Domain,@Disabled,@Description) where not exists (select 1 from Domains WHERE Domain = @domain);

SELECT Domain_ID FROM Domains WHERE Domain = @domain

存在しない場合は挿入され、返されます。既に存在する場合は挿入せず、値を返します

2016年1月編集

最後のクエリは では機能しませんMySql。これはMSSQL構文です

于 2012-10-01T15:33:40.507 に答える
1

Domain_ID がauto_incrementフィールドの場合、パフォーマンスとキャッシングへの影響を考慮せずに、必要な特定の結果を得る簡単な方法は、ステートメントのON DUPLICATE KEY句を使用することです。INSERT

INSERT INTO Domains
    (fld1, fld2, fld3)
    VALUES(....)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);

ON DUPLICATE KEY UPDATE MySQL ドキュメントの末尾のセクションを参照してください。

于 2013-12-18T15:08:58.597 に答える