Mysql

更新整個表一次,標準:column_name 和每個值

  • January 12, 2017

我有一張有 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 version 6.3.5 CE build 201 (64 bit)

它是 MySQL 5.7

Cairo 的本地實例 版本:1.10.2

作業系統:Microsoft Windows 8.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
 ;

引用自:https://dba.stackexchange.com/questions/160629