2015-09-04 61 views
0

我有兩個表,其中一個帶有字符串,需要檢查某些需要替換的字符串。第二個表包含兩列,一個用繩子來進行搜索和一個用字符串替換 - 要短轉換表:翻譯表,替換字符串和選擇適當的行

|Name  |Age|   |Short|Long | 
---------------   ------------ 
|Mr. Smith|23 |   |Mr. |Mister| 
|Ms. Anna |78 |   |Ms. |Misses| 
|Jack Jr. |12 |   |Jr. |Junior| 
|Mister A |23 |   -------------- 
|John  |41 | 
---------------   

我認爲我必須做一個交叉聯接,並選擇不同的值。

但現在我有兩行,與先生和先生的那些,我該如何選擇僅只是那些「先生」:

[I need this table]    [but this is the result] 
|Name   |Age|    |Name   |Age|  
-------------------    -------------------  
|Mister Smith |23 |    |Mr. Smith |23 |  
|Misses Anna |78 |    |Mister Smith |23 | 
|Jack Junior |12 |    |Ms. Anna  |78 | 
|Mister A  |23 |    |Misses Anna |78 | 
|John   |41 |    |Jack Jr.  |12 | 
-------------------    |Jack Junior |12 | 
           |Mister A  |23 | 
           |John   |41 | 
           ------------------- 

我不能做一個「除」,因爲表也包含行,不需要翻譯。

在此先感謝。

+0

結果是什麼話的最大數量可以出現在'name'領域? – seahawk

+0

您可以顯示請詢問您收到該結果嗎? –

+0

從t1交叉連接t2中選擇不同的ifnull(替換(t1.name,t2.short_name,t2.long_name),t1.name),t1.age; –

回答

1

使用下面的SQL查詢:

select ifnull(replace(t1.name,t2.short_name,t2.long_name),t1.name) as name, 
t1.age 

from 
t1 
left join t2 
on t2.short_name=if(instr(t1.name,t2.short_name)>0,t2.short_name,t1.name) 

注意:使用UPPER或情況不匹配LOWER功能。使用TRIM功能解決空間問題。

驗證在http://sqlfiddle.com/#!9/6b238/5

+0

謝謝,請參閱我編輯的問題! –

+0

@ G-M:編輯樣本有什麼不同?這個答案能解決你的問題嗎?如果不是,請指定您在輸出中找到的問題。 – seahawk

+0

對不起,你的解決方案正在工作,但你能解釋一下嗎?我明白,如果替換失敗,它需要t1.name,但我不太瞭解左連接條件't2.short_name = if(instr(t1.name,t2.short_name)> 0,t2.short_name ,t1.name)'因爲't2.short_name = t1.name'永遠不會'''如果instr()<0' –