0

我觉得我在这里错过了一些简单的东西,但是......

如果我在 mySQL 表 (users.fName) 中有以下数据:

--------------    
| Jason M.   |
--------------
| Eric       |
--------------
| Tim S      |
--------------
| Peggy Sue  |
--------------

我想结束:

--------------    
| Jason      |
--------------
| Eric       |
--------------
| Tim        |
--------------
| Peggy Sue  |
--------------

我想我必须消除 . 在 Jason M. 之后(我可以很容易地做到这一点UPDATE users SET fName = REPLACE(fName, ".", "");),但我怎样才能消除 M 和 S 但留下 Sue?

我知道SUBSTRING_INDEX可以获取该字段的一部分,并且我可以使用诸如SELECT SUBSTRING_INDEX(fName, ' ', -1), LENGTH(SUBSTRING_INDEX(fName, ' ', -1)) FROM users获取字符串第二部分的长度之类的方法,但我不确定如何将字段更新为字符串的第一部分,仅第二部分只是一个字符长。

更新

一旦我对他的查询进行了一次更改,@Dan 的答案表就为我提供了我需要的东西。更新后的查询是:

SELECT `fName`, SUBSTRING_INDEX(`fName`, ' ', -1) AS MiddleInitial
    FROM `users`
    WHERE TRIM(`fName`) LIKE '%.' 
        AND length(`fName`)> 4 
        OR length(SUBSTRING_INDEX(`fName`, ' ', -1)) = 1;

最后一个AND变成了OR所有的工作。

4

2 回答 2

3

我有类似的情况,并使用 where 子句仅选择字段中某处带有空格的名称。此外,我检查了我所期望的中间名首字母确实只有一个长的字符length(SUBSTRING_INDEX(First, ' ', -1)) = 1

SELECT `First`, SUBSTRING_INDEX(`First`, ' ', -1) AS MiddleInitial
FROM YourTable
WHERE trim(`First`) LIKE '%.' AND length(`First`)> 4 AND 
length(SUBSTRING_INDEX(`First`, ' ', -1)) = 1;

在运行更新之前查看选择的结果,但这应该将您的查询限制为仅首字母,并留下像比利鲍勃这样的名字。

于 2013-09-05T21:27:49.043 回答
0

您可以使用像UDF这样的用户定义函数并使用正则表达式来执行此操作。

于 2013-02-12T17:01:59.153 回答