2015-10-15 27 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