606行のテーブルがあります。最初の列は単にID
(1から606で始まる)で、次の列名はname1
、other1
、name2
、other2
などです。 name100
、other100
まで。
私は次のようなクエリを作成しようとしています:
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
これは非常に単純なクエリです。更新が必要な列ごとに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
;
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に精通していません。