2014-08-27 75 views
1

我試圖更新已經部分填充的表的很多行。 AREA_TITLE列的區域名稱包含狀態名稱,但從來沒有自己的名稱,因此是%%修飾符。這裏是我的MySQL查詢不包含錯誤(根據續集專業),但實際上不會更新表兩種:從第二列的多個值更新一列中的多行

UPDATE localTable 
SET PRIM_STATE = 
CASE AREA_TITLE 
WHEN '%Alabama%' THEN 'AL' 
WHEN '%Alaska%' THEN 'AK' 
WHEN '%Arizona%' THEN 'AZ' 
WHEN '%Arkansas%' THEN 'AR' 
WHEN '%California%' THEN 'CA' 
WHEN '%Colorado%' THEN 'CO' 
WHEN '%Connecticut%' THEN 'CT' 
WHEN '%Delaware%' THEN 'DE' 
WHEN '%Florida%' THEN 'FL' 
WHEN '%Georgia%' THEN 'GA' 
WHEN '%Hawaii%' THEN 'HI' 
WHEN '%Iowa%' THEN 'IA' 
WHEN '%Idaho%' THEN 'ID' 
WHEN '%Illinois%' THEN 'IL' 
WHEN '%Indiana%' THEN 'IN' 
END 
WHERE AREA_TITLE IN ('%Alabama%', '%Alaska%', '%Arizona%', '%Arkansas%', '%California%', '%Colorado%', '%Connecticut%', '%Delaware%', '%Florida%', '%Georgia%', '%Hawaii%', '%Iowa%', '%Idaho%', '%Illinois%', '%Indiana%'); 

任何幫助,非常感謝!

樣本數據:AREA_TITLE = 「東北阿拉巴馬非都會區」 - > PRIM_STATE = '基地' AREA_TITLE = 「阿肯色中央非都會區」 - > PRIM_STATE = 'AR'

+0

您可以添加在您的文章表中的一些樣本數據? – 2014-08-27 21:33:45

+0

剛剛添加的樣本數據 – 2014-08-27 21:35:40

+0

最好有一個包含狀態的表並加入到該表中。 – Donal 2014-08-27 21:45:02

回答

1

(我主要用SQL Server,但這應該仍然適用,除非我錯了)

這種格式的CASE語句將比較變量和每個WHEN提供的值。您應該使用CASE語句的the second form,其中每個WHEN定義了一個條件並特別使用LIKE運算符。

對於您的WHERE子句也是如此,您實際上將表中的值與字面值%Alabama%進行了比較。需要LIKE運營商,您可能需要使用多個OR而不是IN運營商。

事情是這樣的:

UPDATE localTable 
SET PRIM_STATE = 
CASE 
WHEN AREA_TITLE LIKE '%Alabama%' THEN 'AL' 
WHEN AREA_TITLE LIKE '%Alaska%' THEN 'AK' 
WHEN AREA_TITLE LIKE '%Arizona%' THEN 'AZ' 
WHEN AREA_TITLE LIKE '%Arkansas%' THEN 'AR' 
WHEN AREA_TITLE LIKE '%California%' THEN 'CA' 
WHEN AREA_TITLE LIKE '%Colorado%' THEN 'CO' 
WHEN AREA_TITLE LIKE '%Connecticut%' THEN 'CT' 
WHEN AREA_TITLE LIKE '%Delaware%' THEN 'DE' 
WHEN AREA_TITLE LIKE '%Florida%' THEN 'FL' 
WHEN AREA_TITLE LIKE '%Georgia%' THEN 'GA' 
WHEN AREA_TITLE LIKE '%Hawaii%' THEN 'HI' 
WHEN AREA_TITLE LIKE '%Iowa%' THEN 'IA' 
WHEN AREA_TITLE LIKE '%Idaho%' THEN 'ID' 
WHEN AREA_TITLE LIKE '%Illinois%' THEN 'IL' 
WHEN AREA_TITLE LIKE '%Indiana%' THEN 'IN' 
END 
WHERE AREA_TITLE LIKE '%Alabama%' OR AREA_TITLE LIKE '%Alaska%' OR AREA_TITLE LIKE '%Arizona%' OR AREA_TITLE LIKE '%Arkansas%' OR AREA_TITLE LIKE '%California%' OR AREA_TITLE LIKE '%Colorado%' OR AREA_TITLE LIKE '%Connecticut%' OR AREA_TITLE LIKE '%Delaware%' OR AREA_TITLE LIKE '%Florida%' OR AREA_TITLE LIKE '%Georgia%' OR AREA_TITLE LIKE '%Hawaii%' OR AREA_TITLE LIKE '%Iowa%' OR AREA_TITLE LIKE '%Idaho%' OR AREA_TITLE LIKE '%Illinois%' OR AREA_TITLE LIKE '%Indiana%'); 
+0

非常感謝您在這裏挖掘,對於您關於LIKE的第二個建議,我嘗試更改爲WHERE AREA_TITLE LIKE ...並獲得'Operand應該包含1列'錯誤。 對於你的第一個建議,它也沒有解僱。下面是一個例子:WHA AREA_TITLE LIKE'%Alabama%'THEN'AL' – 2014-08-27 21:36:49

+0

@ZanderFields在where子句中,您將您的字段與每個字符串進行比較,如'AREA_TITLE LIKE'%Alabama%'或AREA_TITLE LIKE'%other value%' ...' – 2014-08-27 21:41:17

+0

是的! '這樣的事情'就是我在你發佈之前開始實施的@Jonathan M,它的工作原理!非常感謝! – 2014-08-27 21:42:52

1

我與測試它sqlfiddle here

create table states 
(
    StateName varchar(100), 
    Abbreviation varchar(5) 
); 

create table localTable 
(
    PRIM_STATE varchar(100), 
    AREA_TITLE varchar(100) 
); 


insert into localtable(AREA_TITLE, PRIM_STATE) values ('Northeast Alabama Non-Metro Area',''); 
insert into localtable(AREA_TITLE, PRIM_STATE) values ('Central Arkansas Non-Metro Area',''); 

insert into states(StateName, Abbreviation) values ('Alabama','AL'); 
insert into states(StateName, Abbreviation) values ('Alaska','AK'); 
insert into states(StateName, Abbreviation) values ('Arkansas','AR'); 


update localtable 
set localtable.PRIM_STATE = (
    select states.Abbreviation 
    from states where 
    localtable.area_title LIKE CONCAT('%', states.StateName, '%') 
); 
+0

非常有趣,我必須給這個鏡頭。謝謝Donal! – 2014-08-27 22:38:49

相關問題