SQL嵌套替换顺序

时间:2018-10-03 14:15:45

标签: sql tsql replace nested

愚蠢的问题,但似乎找不到快速答案...我正在创建UDF以使用嵌套替换替换名称前缀...类似这样:

REPLACE(
 REPLACE(
  REPLACE(
   REPLACE(
    REPLACE(
     REPLACE(
      REPLACE(
       REPLACE(
        @Name
       , 'Mr ', '')
      , 'Mrs ', '')
     , 'Ms ', '')
    , 'Dr ', '')
   , 'Mr. ', '')
  , 'Mrs. ', '')
 , 'Ms. ', '')
, 'Dr. ', '')

,但要替换包含“。”的内容。在没有之前。嵌套替换的顺序/层次结构是什么? TIA,丹尼

2 个答案:

答案 0 :(得分:2)

最里面的替换将始终首先在字符串上运行。因此,从内到外是它们执行的顺序。我建议尽管尝试通过使用正则表达式和case语句尝试一种更优雅的方法,以便维护而不是仅仅拥有大量嵌套替换(不一定全部都能奏效)更容易。

答案 1 :(得分:0)

我建议在SQL中使用类似这样的函数:

CREATE FUNCTION [dbo].[ReplaceNamePrefix]
(@value NVARCHAR(50)
)
RETURNS NVARCHAR(50)
AS
     BEGIN
         DECLARE @RETURN NVARCHAR(50);
         SET @RETURN = @value;
         SET @RETURN = REPLACE(@RETURN, 'Mrs.', ''); 
         SET @RETURN = REPLACE(@RETURN, 'Mrs', '');
         SET @RETURN = REPLACE(@RETURN, 'Mr.', '');
         SET @RETURN = REPLACE(@RETURN, 'Mr', '');
         SET @RETURN = REPLACE(@RETURN, 'Ms.', '');
         SET @RETURN = REPLACE(@RETURN, 'Ms', ''); 
         SET @RETURN = REPLACE(@RETURN, 'Dr. ', '');
         SET @RETURN = REPLACE(@RETURN, 'Dr', ''); ');
         SET @RETURN = RTRIM(LTRIM(@RETURN));
         RETURN @RETURN;
     END;

使用以下命令获取目标:

SELECT [dbo].[ReplaceNamePrefix]('Dr. Danny Dennison');

结果是:丹尼·丹尼森

enter image description here

但是,如果您坚持使用自己的代码,请使用以下代码:

SELECT REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( 'MR  Danny Dennison', 'Mrs.', '' ), 'Mrs', '' ), 'Mr.', '' ), 'Mr', '' ), 'Ms.', '' ), 'Ms', '' ), 'Dr. ', '' ), 'Dr', '' );