web-dev-qa-db-ja.com

テーブル全体の1回の更新、基準:column_nameおよび各値

606行のテーブルがあります。最初の列は単にID(1から606で始まる)で、次の列名はname1other1name2other2などです。 name100other100まで。

私は次のようなクエリを作成しようとしています:

update each cell if column_name like "other"
if 0< cellValue < 50 then cellValue=cellValue*10
if 50<=cellValue<120 then cellValue=cellValue*5
if 120<=cellValue<230 then cellValue=cellValue*2

ワンショットクエリなので、効率についてはあまり気にしません。

私はそれを解決しようと努力しました。私がやろうとしていることをよりよく説明するために複雑な疑似コードのアイデアを得ましたが、SQLクエリはすべての値をチェックするので、SQLでは不要であると思います。

begin
for i in 1 to 100
  for each row
    if current column is named like "other"i then
      if 10000< value then value=value/40
      elseif 0< value<50 then value=value*10
      elseif 50<=value<120 then value=value*5
      elseif 120<=value<230 then value=value*2
      elseif 230<=value<500 then value=value*2
      endif
    endif
  end for
end for
end

私は何人かの人々に尋ねました、そして彼らはどちらも知りません。

結果として:

SHOW CREATE TABLE example

CREATE TABLE `example`
( `id` int(11) NOT NULL,
  `name1` int(11) NOT NULL,
  `other1` int(11) NOT NULL,  
  `name2` int(11) NOT NULL,
  `other2` int(11) NOT NULL,
  --
  -- 2 * 97 columns skipped
  --
 `name100` int(11) NOT NULL, 
 `other100` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

私が使用しています:

MySQL Workbench Community(GPL)for Windowsバージョン6.3.5 CEビルド201(64ビット)
これはMySQL 5.7のローカルインスタンスです
カイロバージョン:1.10.2
OS:Microsoft Windows 8.1

2
NewMilenium

これは非常に単純なクエリです。更新が必要な列ごとに1つずつ、CASE式を使用できます。

UPDATE table_name
SET other1 = CASE WHEN other1 <=  0 THEN other1    -- no change
                  WHEN other1 <  50 THEN other1 * 10
                  WHEN other1 < 120 THEN other1 *  5
                  WHEN other1 < 230 THEN other1 *  2
                  -- possibly more WHEN..THEN clauses 
                  ELSE other1
             END,
    other2 = CASE WHEN other2 <=  0 THEN other2       -- no change
                  WHEN other2 <  50 THEN other2 * 10
                  WHEN other2 < 120 THEN other2 *  5
                  WHEN other2 < 230 THEN other2 *  2 
                  ELSE other2
             END,
    --- repeat similarly for all columns that need updating
  ;
2
ypercubeᵀᴹ

Caseステートメント自体はかなり簡単ですが、次のクエリのようなものを使用することで、100のUPDATEステートメントを書く時間を節約できます。

SELECT  'UPDATE '+TABLE_SCHEMA+'.'+TABLE_NAME+'
        SET '+COLUMN_NAME+' = CASE 
                        WHEN '+COLUMN_NAME+' <  50 THEN '+COLUMN_NAME+' * 10
                        WHEN '+COLUMN_NAME+' < 120 THEN '+COLUMN_NAME+' *  5
                        WHEN '+COLUMN_NAME+' < 230 THEN '+COLUMN_NAME+' *  2                              
                        ELSE '+COLUMN_NAME+'
                     END'
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   TABLE_SCHEMA = 'tableSchemaHere'
        AND TABLE_NAME = 'tableNameHere'
        AND COLUMN_NAME LIKE 'other%'

スキーマとテーブルの名前をWHERE句に入力することにより、上記のクエリは一連の100のSQLステートメントを生成して列を更新します。結果をコピーして最終的なスクリプトに貼り付けるだけです。

本当に望めば、すべてを1つのUPDATEステートメントにまとめることができますが、少し文字列を操作する必要があるため、残念ながら、他のSQL実装ほどMySQLに精通していません。

1
Duffy