我在查询具有ONeil值的sql服务器表。我的目标是为查询的数据添加一个撇号。我知道这将是更容易从源(PHP)修复了问题,但必须对这些脚本在UPPER中搜索前两个字符的字段
表结构没有接入,
ID First_Name Last_Name
1 John ONEil
2 Sam OMally
3 Sarah OConner
我在查询具有ONeil值的sql服务器表。我的目标是为查询的数据添加一个撇号。我知道这将是更容易从源(PHP)修复了问题,但必须对这些脚本在UPPER中搜索前两个字符的字段
表结构没有接入,
ID First_Name Last_Name
1 John ONEil
2 Sam OMally
3 Sarah OConner
你可以做的第一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
在搜索字符串,前两个字符是大写:
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 ║
╚════╩════════════╩═══════════╝
如果你有一个人在上面,这会把SMITH变成S'MITH。 –
@MichaelY。是的问题标题'在UPPER中搜索一个具有前两个字符的字段'。 – lad2025
是的,我可以看到标题。如果你阅读问题的主体,你会看到意图是什么。 –
表
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 |
+-----------+
如果你想更新姓氏场,其中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)
您的问题需要多一点澄清,但我想象一下,如果前两个字符是大写,但是如果不是则返回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
可以使用两个功能来做到这一点。
第一个是SUBSTRING(切割前两个字母) ,第二个是ASCII (大写开始从41至5A的ASCII数)它可以帮助你找到两个第一大写字母。
了解更多:
确保你没有错转换所有UPPER姓氏。例如SMITH。 –