0

SQL構文と、単一のクエリで特定のアクションが可能かどうかについて質問があります。次の例を考えてみましょう。

レシピテーブルがあるとしましょう。すべてのレシピには、component1、component2などの列に5つの成分がリストされています。また、突然砂糖が不健康であると判断され、すべてのレシピで、存在するすべての成分列で「砂糖」を「人工甘味料」に置き換える必要があるとします。私が遭遇した問題は、材料テーブルがないことです。したがって、すべての材料は、材料IDのようなものを参照するのではなく、文字通り5つの列の1つにリストされます。

可能であれば、次の(疑似)クエリを作成するにはどうすればよいですか?

UPDATE Recipe 
    (SET ingredient1 = 'artificial sweetener' WHERE ingredient1 = 'sugar') OR
    (SET ingredient2 = 'artificial sweetener' WHERE ingredient2 = 'sugar') OR
    (SET ingredient3 = 'artificial sweetener' WHERE ingredient3 = 'sugar') OR
    (SET ingredient4 = 'artificial sweetener' WHERE ingredient4 = 'sugar') OR
    (SET ingredient5 = 'artificial sweetener' WHERE ingredient5 = 'sugar')

現在の値に基づいて列を特定の値に設定することについて、オンラインで複数の記事を見つけましたが、値を含む(特定の)列を設定することだけではありません。どんな助けでも大歓迎です。

4

5 に答える 5

6

私はあなたの質問に「あなたが聞きたいものではない」という答えで答えます。データベースを誤って設計しました。

次の構造が必要です。

Recipe
RecipeID, other recipe information

Ingredient
IngredientID, RecipeID, Ingredient, Measurement...

理想的には、実際には、おそらくIngredientルックアップテーブルRecipeIngredientとして、測定情報との結合テーブルとして持ってIngredientIDいるでしょうが、それでも上記はあなたが持っているものよりもはるかに優れています。

次に、更新は次のようになります。

update Ingredient 
    set Ingredient='artificial sweetener' 
    where Ingredient='sugar'
于 2012-04-24T19:29:05.137 に答える
4

CASE式は、5つの列のそれぞれを変更する必要があるかどうかを示します。WHERE句を使用して、変更を必要としない行を除外します。

UPDATE Recipe
SET ingredient1 = CASE WHEN ( ingredient1 = 'sugar' )  
    THEN 'artificial sweetener' ELSE ingredient1 END ,
SET ingredient2 = CASE WHEN ( ingredient2 = 'sugar' )  
    THEN 'artificial sweetener' ELSE ingredient2 END ,
SET ingredient3 = CASE WHEN ( ingredient3 = 'sugar' )  
    THEN 'artificial sweetener' ELSE ingredient3 END ,
SET ingredient4 = CASE WHEN ( ingredient4 = 'sugar' )  
    THEN 'artificial sweetener' ELSE ingredient4 END ,
SET ingredient5 = CASE WHEN ( ingredient5 = 'sugar' )  
    THEN 'artificial sweetener' ELSE ingredient5 END
WHERE 'sugar' IN 
  ( ingredient1, ingredient2, ingredient3, ingredient4, ingredient5 )
;
于 2012-04-24T19:33:11.033 に答える
1

データベースの再設計を検討すると、現在の設計はあまり友好的ではありません。とにかく、あなたが探している答えは、case-whenupdate句を使用することです。

UPDATE tablename
SET 
INGREDIENT1 = CASE WHEN INGREDIENT1='SUGAR' THEN 'ARTIFICIAL SWEETENER' ELSE INGREDIENT1    END,
INGREDIENT2 = CASE WHEN INGREDIENT2='SUGAR' THEN 'ARTIFICIAL SWEETENER' ELSE INGREDIENT2 END
于 2012-04-24T19:35:10.077 に答える
0

あなたは次のようなことをすることができます:

UPDATE Recipe SET 
       ingredient1 = if(ingredient1 = 'sugar', 'artificial sweetener', ingredient1),
       ingredient2 = if(ingredient2 = 'sugar', 'artificial sweetener', ingredient2),
       ..etc..
于 2012-04-24T19:25:53.623 に答える
0

以下はやや移植性があります。

UPDATE Recipe
SET ingredient1 = CASE ingredient1 WHEN 'sugar' THEN 'artificial sweetener' ELSE ingredient1 END,
SET ingredient2 = CASE ingredient2 WHEN 'sugar' THEN 'artificial sweetener' ELSE ingredient2 END,
SET ingredient3 = CASE ingredient3 WHEN 'sugar' THEN 'artificial sweetener' ELSE ingredient3 END,
SET ingredient4 = CASE ingredient4 WHEN 'sugar' THEN 'artificial sweetener' ELSE ingredient4 END,
SET ingredient5 = CASE ingredient5 WHEN 'sugar' THEN 'artificial sweetener' ELSE ingredient5 END
WHERE ingredient1 = 'sugar'
    OR ingredient2 = 'sugar'
    OR ingredient3 = 'sugar'
    OR ingredient4 = 'sugar'
    OR ingredient5 = 'sugar'

これにより、レシピに砂糖が含まれている限り、現在の値に関係なく、これらすべての列が技術的に更新されることに注意してください。これは、単一のUPDATEステートメントとこのスキーマを使用した結果です。クエリオプティマイザは通常、個々の値ではなく、行と列全体の観点から考えます。

于 2012-04-24T19:42:00.350 に答える