2015-10-15 63 views
0

我在查詢具有ONeil值的sql服務器表。我的目標是爲查詢的數據添加一個撇號。我知道這將是更容易從源(PHP)修復了問題,但必須對這些腳本在UPPER中搜索前兩個字符的字段

表結構沒有接入,

ID  First_Name  Last_Name 
1  John   ONEil 
2  Sam   OMally 
3  Sarah   OConner 
+0

確保你沒有錯轉換所有UPPER姓氏。例如SMITH。 –

回答

0

你可以做的第一2個字符的字符串比較,找出哪些記錄有姓氏以2個大寫字母,像這樣開頭:

create table test (Last_Name varchar(50)); 
insert into test values ('ONEil'), ('OMally'), ('OConner'), ('Michaels'); 

select * from test where hex(left(Last_Name, 2)) = hex(upper(left(Last_Name,2))) 

Result: 
Last_Name 
ONEil 
OMally 
OConner 

要更新這些記錄,你可以這樣做:

update test 
set Last_Name = concat(left(Last_Name, 1), '''', mid(Last_Name, 2, length(Last_Name)-2)) 
where hex(left(Last_Name, 2)) = hex(upper(left(Last_Name,2))) 

select * from test; 

Results: 
Last_Name 
O'NEi 
O'Mall 
O'Conne 
Michaels 

SQLFiddle例如:http://sqlfiddle.com/#!9/8165e4/2

+0

那麼像MICHAELS這樣的ALL UPP怎麼樣? –

+0

在上面的解決方案中,MICHAELS將成爲M'ICHAELS – zedfoxus

+0

是的,正好... –

0

在搜索字符串,前兩個字符是大寫:

LiveDemo

CREATE TABLE #mytable(
    ID   INTEGER NOT NULL PRIMARY KEY 
    ,First_Name VARCHAR(5) NOT NULL 
    ,Last_Name VARCHAR(7) NOT NULL 
); 
INSERT INTO #mytable(ID,First_Name,Last_Name) VALUES (1,'John','ONEil'); 
INSERT INTO #mytable(ID,First_Name,Last_Name) VALUES (2,'Sam','OMally'); 
INSERT INTO #mytable(ID,First_Name,Last_Name) VALUES (3,'Sarah','OConner'); 
INSERT INTO #mytable(ID,First_Name,Last_Name) VALUES (4,'Sarah','Smith'); 


SELECT 
    ID, 
    First_Name, 
    Last_Name = CONCAT(LEFT(Last_Name, 1), '''', RIGHT(Last_Name, LEN(Last_Name)-1)) 
FROM #mytable 
WHERE Last_Name LIKE '[A-Z][A-Z]%' COLLATE Latin1_General_BIN; 

輸出:

╔════╦════════════╦═══════════╗ 
║ ID ║ First_Name ║ Last_Name ║ 
╠════╬════════════╬═══════════╣ 
║ 1 ║ John  ║ O'NEil ║ 
║ 2 ║ Sam  ║ O'Mally ║ 
║ 3 ║ Sarah  ║ O'Conner ║ 
╚════╩════════════╩═══════════╝ 
+0

如果你有一個人在上面,這會把SMITH變成S'MITH。 –

+0

@MichaelY。是的問題標題'在UPPER中搜索一個具有前兩個字符的字段'。 – lad2025

+0

是的,我可以看到標題。如果你閱讀問題的主體,你會看到意圖是什麼。 –

0

mysql> select * from names where LEFT(last_name, 2) = UPPER(LEFT(last_name, 2)); 
+-----------+ 
| last_name | 
+-----------+ 
| Michael | 
| Blah  | 
| ONeil  | 
+-----------+ 

更新查詢

update names 
set last_name = concat(left(last_name, 1), '\'', right(last_name, length(last_name)-1)) 
where binary left(last_name, 2) = upper(left(last_name, 2)) 
    and binary upper(left(last_name, 3)) <> left(last_name, 3); 

結果

+-----------+ 
| last_name | 
+-----------+ 
| Michael | 
| Blah  | 
| O'Neil | 
+-----------+ 
0

如果你想更新姓氏場,其中1號2字符大寫包括一個單引號的話,我會發出更新查詢:

update tablename set last_name=left(last_name,1) + char(146) + substring(last_name,2) 
where binary upper(left(last_name,2))=left(last_name,2) 
0

您的問題需要多一點澄清,但我想象一下,如果前兩個字符是大寫,但是如果不是則返回Oneal,而您想要返回O'Neil而不是ONeil

如果是這樣,這是一個使用整理,的情況下,上一個選項,左,右......

select id, first_name, last_name, 
    case when left(last_name,2) = upper(left(last_name,2)) 
            collate SQL_Latin1_General_CP1_CS_AS 
     then left(last_name,1) + '''' + right(last_name, len(last_name) - 1) 
     else last_name 
    end as new_last_name 
from yourtable