我想在PHP中創建一個SQL查詢來更新表。 是否有可能爲每個受影響的行有不同的WHERE
子句?SQL - UPDATE中每個SET命令的WHERE子句?
比如像:
UPDATE table
SET val=X WHERE someproperty = 1,
SET val=Y WHERE someproperty = 2
等?
任何幫助表示讚賞。謝謝
我想在PHP中創建一個SQL查詢來更新表。 是否有可能爲每個受影響的行有不同的WHERE
子句?SQL - UPDATE中每個SET命令的WHERE子句?
比如像:
UPDATE table
SET val=X WHERE someproperty = 1,
SET val=Y WHERE someproperty = 2
等?
任何幫助表示讚賞。謝謝
對於任何SQL語句,不能有多個WHERE子句,但是可以使用CASE語句來完成您正在嘗試執行的操作。另一個選項是執行多個UPDATE語句。
下面是使用CASE語句的示例:
UPDATE table
SET val = (
CASE someproperty
WHEN 1 THEN X
WHEN 2 THEN Y
ELSE val
END
);
下面是使用多個UPDATE語句的例子:
UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;
沒有。使兩個更新:
UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;
關於第二個想法,你可以使用子查詢或case語句......
UPDATE table SET val= (case when someproperty = 1 then X when someproperty = 2 then Y else val END)
你可能需要做一個子查詢是這樣的:
UPDATE table t1 SET val = (select CASE when someproperty = 1 then X when someproperty = 2 then Y ELSE val END from table t2 where t1.primarykey = t2.primary key)
是的,你可以用一個CASE語句。現在
UPDATE table
SET val = CASE someproperty
WHEN 1 THEN x
WHEN 2 THEN y
....
ELSE
val
END
,令人擔憂的是相比於幾個UPDATE
報表時一個CASE
語句的可讀性。這裏有一個有效的論點。例如,當更新1000行時,只需使用幾個UPDATE
語句而不是1000個不同的條件與單個CASE
,就會感覺更好。
但是,有時CASE語句更合適。例如,如果您基於某些特徵更新行,比如表中字段值的偶數或奇數性質,那麼CASE
語句就是一種非常簡潔和可維護的方法,可以更新表中的行而不必訴諸於數量龐大的UPDATE
陳述全部共享特定類型的邏輯。藉此,例如:
UPDATE table
SET val = CASE MOD(someproperty, 2)
WHEN 0 THEN x
WHEN 1 THEN y
END
這個表達式接收someproperty的模量,並且當0(偶數),值x分配給VAL,並且當1(奇數),值y分配給VAL。這條語句正在更新的數據量越大,與多個UPDATE
語句進行比較的清潔程序就越多。
簡而言之,CASE
語句有時與UPDATE
語句一樣可讀/可維護。這完全取決於你想要對他們做什麼。
編輯:增加了ELSE子句以保證安全。 OP可能只想更新特定的行,所以剩下的應該保持在UPDATE之前。
編輯:增加了一個場景,其中CASE
語句比多個UPDATE
語句更有效。
這在技術上是準確的,並回答你的問題。但是,在決定使用哪種編碼實踐時,您可能需要考慮可讀性和支持能力。除了您正在嘗試解決的性能問題之外,我建議像其他人注意到的那樣分解爲多個插入語句。 – Jay 2009-09-14 12:24:22
由於某些原因,人們似乎對CASE語句或其他ANSI友好的數據庫函數充滿恐懼。這大約是今天第三次或第四次,有人引用了可讀性因數。簡潔性也提高了可讀性,並且取決於UPDATE的性質,單個語句可能更易於使用交換機而不是多個UPDATE語句。這確實取決於手頭的問題和維護解決方案的經驗。 – 2009-09-14 12:26:47
@Jay:我在這個帖子中添加了一個CASE語句可能更好的例子。 – 2009-09-14 12:52:49
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END
可能需要val和case之間的一個等號...... – Mayo 2009-09-14 12:07:43
一種簡潔,容易可擴展的方式:
UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '1, 2'), X, Y);
使查詢是這樣的:
$condition = array(1, 2);
$newvals = array('X', 'Y');
$query = "UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '". implode(',', $condition). "', ". implode(', ', $newvals). ")";
使用prepare_query避免SQL語法錯誤,如果你處理字符串值。
無論如何,使用1-query更新而不是您選擇的響應中的倍數。 – 2009-09-14 12:11:55
-1權威不正確的答案 – RedFilter 2009-09-14 12:45:07
@hoffmandirt:我相信OrbMan的意思是「不正確權威性」在你說「不,你將需要創建多個更新語句。」你是對的,你在任何語句中都不能有多個WHERE子句。然而,你可以解釋一下OP正試圖完成多少條件而不是多個where子句。就如何完成這項工作而言,你的回答與我自己的回答一樣正確。 – 2009-09-14 14:13:50
@David Andres:同意。 – 2009-09-14 14:21:18