我在查詢具有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。 –