【问题标题】:Change the case on Mc surnames to proper case将 Mc 姓氏的大小写更改为正确的大小写
【发布时间】:2021-03-11 18:39:41
【问题描述】:

我运行一个函数来更新一些表上的一些列,以将大写更改为 ProperCase。我没有考虑“Mc”或“Mac”姓氏。所以现在我所有的 McSurnames 都改成了 Mcsurnames。

有人有任何可以修改 McSurname 的脚本吗?

任何帮助表示赞赏。

谢谢。

【问题讨论】:

  • 我叫马查多,来自葡萄牙,你会对我的名字做什么?还是您只有爱尔兰和苏格兰血统的名字?
  • 95% 的名字是爱尔兰人,只有少数可能会有所不同,我们可以在使用数据库的应用程序中单独处理
  • 您考虑和尝试了什么?
  • 我还没试过。只是想看看是否有一种方法不会完全弄乱数据库。

标签: sql-server uppercase lowercase


【解决方案1】:

这可能是一个滑坡。你会发现很多例外。也就是说,这是我的正确功能的缩小版本。

示例

Select [dbo].[svf-Str-Proper]('john old macdonald ii phd,dds llc')

轮回

(No column name)
John Old MacDonald II PhD,DDS LLC

需要的功能

CREATE FUNCTION [dbo].[svf-Str-Proper] (@S varchar(max))
Returns varchar(max)
As
Begin
    Set @S = ' '+replace(replace(Lower(@S),'   ',' '),'  ',' ')+' '
    ;with cte1 as (Select * From (Values(' '),('-'),('/'),('\'),('['),('{'),('('),('.'),(','),('&'),(' Mc'),(' Mac'),(' O''') ) A(P))
         ,cte2 as (Select * From (Values('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M')
                                       ,('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z')
                                       ,('LLC'),('PhD'),('MD'),('DDS')
                                       ,('II '),('III '),('IV ')
                                       ,('ID '),('PW ')
                                 ) A(S))
         ,cte3 as (Select F = Lower(A.P+B.S),T = A.P+B.S From cte1 A Cross Join cte2 B 
                   Union All 
                   Select F = Lower(B.S+A.P),T = B.S+A.P From cte1 A Cross Join cte2 B where A.P in ('&') 
                  ) 
    Select @S = replace(@S,F,T) From cte3 
    Return rtrim(ltrim(@S))
End

【讨论】:

  • 谢谢约翰,辛苦了 - 你有完整的正确案例脚本的链接吗?
  • @MalcolmPH 对不起,我的正确函数实际上是链接到一个表,以便我们可以维护异常
【解决方案2】:

如果我们首先将前缀放入变量中。

然后我们需要过滤表格,使其之后至少有两个字符。

我们更新表格,使新值是前缀,后跟下一个字母的大写,然后是原始值的其余部分。

DECLARE @prefix nvarchar(100) = 'Mc'; -- or Mac

UPDATE table
SET lastname = @prefix + UPPER(SUBSTRING(lastname, LEN(@prefix) + 1, 1)) + SUBSTRING(lastname, LEN(@prefix) + 2, LEN(lastname)
WHERE lastname LIKE @prefix + '[a-z][a-z]%';

您可以使用两个不同的前缀运行两次。

【讨论】:

  • 如果您实际描述了它的作用,那将是一个更好的答案。您知道纯代码的答案是不受欢迎的。
  • 所以在所有 Mcxxxxxx 前面加上 Mc = McMcxxxxxxx 然后用 McX 替换 McMc??
  • 不,我们跳过前几个字母(前缀的长度)。变成'Mc' + 'X' + 'xxxxxx'
猜你喜欢
  • 1970-01-01
  • 2017-06-05
  • 2018-03-03
  • 2010-11-24
  • 2017-09-15
  • 2021-03-30
  • 2010-09-18
  • 2017-12-01
相关资源
最近更新 更多