如何使用函数从 SQL 服务器中的名称字符串中删除多个可能的前缀
How to use a function remove multiple possible prefixes from a Name string in SQL Server
我需要通过删除报告的前缀来更正用户名。我需要在这里使用 function,因为报告中有详细的案例逻辑。我想传递一个带前缀的名字,然后取回一个不带前缀的名字。作为 select.
的一部分,我将在报告的每一行应用该函数
例如,我的前缀列表是:
am, auf, auf dem, aus der, d, da, de, de l’, del, de la, de le, di, do, dos, du,
im, la, le, mac, mc, mhac, mhíc, mhic giolla, mic, ni, ní, níc, o, ó,
ua, ui, uí, van, van de, van den, van der, vom, von, von dem, von den, von der
我想从名字中删除任何这些前缀(如果存在)。
例如-输入:
输出:
我知道我可以采用蛮力方法并进行 40 次奇数次替换,但想知道是否有 better/smarter 使用函数执行此操作的方法,给定报告中的名称列表每天可以达到数万。
我根据对另一个问题的回答创建了这个函数,但它对我不起作用:
改变函数 [dbo].[fn_RemoveNamePrefix](@name varchar(100))
RETURNS 变量(100)
作为
开始
声明@name_without_prefix varchar(100)
select 顶部 (1) @name_without_prefix = left(@name, len(@name) - len(v.prefix) - 1)
来自 (值 ('am'),('auf'),('am'), ('auf'),('aufdem'),('ausder'),('d'),('da'),('de'),('del’'),('del'),('dela'),('dele'),('di'),('do'),('dos'),('du'),('im' ),
('la'),('le'),('mac'),('mc'),('mhac'),('mhíc'),('mhicgiolla'),('mic'),('ni'),('ní'),('níc'),('o'),('ó' ),('ua'),('ui'),('uí'),('van'),('vande'),('vanden'), ('vander'),
('vom'),('von'),('vondem'),('vonden'),('vonder')
)v(前缀)
where @name like '%' + v.prefix
按长度排序(v.prefix) desc
return@name_without_prefix
结束
谢谢
我想你想要:
select top (1) @first_name_without_prefix = left(@first_name, len(@first_name) - len(v.prefix) - 1)
from (values ('am'), ('auf')
) v(prefix)
where @first_name like '% ' + v.prefix
order by len(v.prefix) desc
我需要通过删除报告的前缀来更正用户名。我需要在这里使用 function,因为报告中有详细的案例逻辑。我想传递一个带前缀的名字,然后取回一个不带前缀的名字。作为 select.
的一部分,我将在报告的每一行应用该函数例如,我的前缀列表是:
am, auf, auf dem, aus der, d, da, de, de l’, del, de la, de le, di, do, dos, du,
im, la, le, mac, mc, mhac, mhíc, mhic giolla, mic, ni, ní, níc, o, ó,
ua, ui, uí, van, van de, van den, van der, vom, von, von dem, von den, von der
我想从名字中删除任何这些前缀(如果存在)。
例如-输入:
输出:
我知道我可以采用蛮力方法并进行 40 次奇数次替换,但想知道是否有 better/smarter 使用函数执行此操作的方法,给定报告中的名称列表每天可以达到数万。
我根据对另一个问题的回答创建了这个函数,但它对我不起作用:
改变函数 [dbo].[fn_RemoveNamePrefix](@name varchar(100))
RETURNS 变量(100) 作为 开始
声明@name_without_prefix varchar(100)
select 顶部 (1) @name_without_prefix = left(@name, len(@name) - len(v.prefix) - 1)
来自 (值 ('am'),('auf'),('am'), ('auf'),('aufdem'),('ausder'),('d'),('da'),('de'),('del’'),('del'),('dela'),('dele'),('di'),('do'),('dos'),('du'),('im' ), ('la'),('le'),('mac'),('mc'),('mhac'),('mhíc'),('mhicgiolla'),('mic'),('ni'),('ní'),('níc'),('o'),('ó' ),('ua'),('ui'),('uí'),('van'),('vande'),('vanden'), ('vander'), ('vom'),('von'),('vondem'),('vonden'),('vonder') )v(前缀)
where @name like '%' + v.prefix
按长度排序(v.prefix) desc
return@name_without_prefix
结束
谢谢
我想你想要:
select top (1) @first_name_without_prefix = left(@first_name, len(@first_name) - len(v.prefix) - 1)
from (values ('am'), ('auf')
) v(prefix)
where @first_name like '% ' + v.prefix
order by len(v.prefix) desc