2009-09-14 65 views
4

我想在PHP中創建一個SQL查詢來更新表。 是否有可能爲每個受影響的行有不同的WHERE子句?SQL - UPDATE中每個SET命令的WHERE子句?

比如像:

UPDATE table 
SET val=X WHERE someproperty = 1, 
SET val=Y WHERE someproperty = 2 

等?

任何幫助表示讚賞。謝謝

回答

8

對於任何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; 
+0

-1權威不正確的答案 – RedFilter 2009-09-14 12:45:07

+0

@hoffmandirt:我相信OrbMan的意思是「不正確權威性」在你說「不,你將需要創建多個更新語句。」你是對的,你在任何語句中都不能有多個WHERE子句。然而,你可以解釋一下OP正試圖完成多少條件而不是多個where子句。就如何完成這項工作而言,你的回答與我自己的回答一樣正確。 – 2009-09-14 14:13:50

+0

@David Andres:同意。 – 2009-09-14 14:21:18

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) 
14

是的,你可以用一個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語句更有效。

+0

這在技術上是準確的,並回答你的問題。但是,在決定使用哪種編碼實踐時,您可能需要考慮可讀性和支持能力。除了您正在嘗試解決的性能問題之外,我建議像其他人注意到的那樣分解爲多個插入語句。 – Jay 2009-09-14 12:24:22

+1

由於某些原因,人們似乎對CASE語句或其他ANSI友好的數據庫函數充滿恐懼。這大約是今天第三次或第四次,有人引用了可讀性因數。簡潔性也提高了可讀性,並且取決於UPDATE的性質,單個語句可能更易於使用交換機而不是多個UPDATE語句。這確實取決於手頭的問題和維護解決方案的經驗。 – 2009-09-14 12:26:47

+0

@Jay:我在這個帖子中添加了一個CASE語句可能更好的例子。 – 2009-09-14 12:52:49

1
UPDATE TABLE 
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END 
+0

可能需要val和case之間的一個等號...... – Mayo 2009-09-14 12:07:43

0

一種簡潔,容易可擴展的方式:

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語法錯誤,如果你處理字符串值。

+0

無論如何,使用1-query更新而不是您選擇的響應中的倍數。 – 2009-09-14 12:11:55