2017-08-15 48 views
0

我有一個人在下列格式的名稱一欄:「姓氏,名字」允許逗號可選的後 SQL Server 2016如何在T-SQL中使用簡單的正則表達式?

  • 空間

    • 只有上殼

    我想使用正則表達式:[AZ] +,[]?[AZ] +,但我不知道如何在T-SQL中執行此操作。在Oracle中,我會使用REGEXP_LIKE,對於SQL Server 2016有沒有類似的東西?

    我需要的東西像下面這樣:

    UPDATE table 
    SET is_correct_format = 'YES' 
    WHERE REGEXP_LIKE(table.name,'[A-Z]+,[ ]?[A-Z]+'); 
    
  • +4

    TSQL不支持正則表達式。你需要爲此使用CLR。或者是一個沒有正則表達式的更復雜的TSQL表達式。雖然你可能想看到[Falsehoods程序員相信姓名](http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/)。 –

    +0

    在SQL Server中不是標準的。但是請查看[SQL#](https://sqlsharp.com/features/)(請參閱RegEx)。 –

    +0

    這是用於輸入驗證嗎? – scsimon

    回答

    1

    首先,區分大小寫取決於數據庫的整理,雖與LIKE您可以指定情況的比較。有了這個......這裏有一些布爾邏輯來照顧你所說的情況。但是,如果您發現某些虛假輸入,則可能需要添加其他子句。

    declare @table table (Person varchar(64), is_correct_format varchar(3) default 'NO') 
    insert into @table (Person) 
    values 
    ('LowerCase, Here'), 
    ('CORRECTLY, FORMATTED'), 
    ('CORRECTLY,FORMATTEDTWO'), 
    ('ONLY FIRST UPPER, LowerLast'), 
    ('WEGOT, FormaNUMB3RStted'), 
    ('NoComma Formatted'), 
    ('CORRECTLY, TWOCOMMA, A'), 
    (',COMMA FIRST'), 
    ('COMMA LAST,'), 
    ('SPACE BEFORE COMMA , GOOD'), 
    (' SPACE AT BEGINNING, GOOD') 
    
    
    update @table 
    set is_correct_format = 'YES' 
    where 
         Person not like '%[^A-Z, ]%'             --check for non characters, excluding comma and spaces 
        and len(replace(Person,' ','')) = len(replace(replace(Person,' ',''),',','')) + 1 --make sure there is only one comma 
        and charindex(',',Person) <> 1              --make sure the comma isn't at the beginning 
        and charindex(',',Person) <> len(Person)           --make sure the comma isn't at the end 
        and substring(Person,charindex(',',Person) - 1,1) <> ' '       --make sure there isn't a space before comma 
        and left(Person,1) <> ' '               --check preceeding spaces 
        and UPPER(Person) = Person collate Latin1_General_CS_AS        --check collation for CI default (only upper cases) 
    
    select * from @table 
    
    +0

    我也喜歡這種方法。一些微不足道的情況:尾隨/先行空格。逗號後有多個空格。我不確定'唯一的首要'應該是一個有效的比賽。 「[A-Z] +」意味着在逗號前沒有空格。 – Greenspark

    +0

    SQL Server中的比較操作會忽略尾隨空格,因此它們沒有實際影響,但是可以檢查前導空格。我將補充說明。如果有兩個或三個部分名稱,在西班牙文化和其他文化中很常見,但我沒有說明多個空間,但這是一個很好的觀點。 – scsimon

    1

    tsql等價物可能看起來像這樣。我並不贊同這種解決方案的效率。

    declare @table as table(name varchar(20), is_Correct_format varchar(5)) 
    insert into @table(name) Values 
    ('Smith, Jon') 
    ,('se7en, six') 
    ,('Billy bob') 
    
    
    UPDATE @table 
    SET is_correct_format = 'YES' 
    WHERE 
    replace(name, ', ', ',x') 
        like (replicate('[a-z]', charindex(',', name) - 1) 
         + ',' 
         + replicate('[a-z]', len(name) - charindex(',', name))) 
    
    
    select * from @table 
    

    可選的空間是很難解決的,所以因爲它的旁邊有一個合法的字符,我只是用另一種合法的字符替換,當它的存在。

    TSQL沒有在正則表達式中提供*或+的「重複模式」,所以您必須對搜索模式中的字符進行多次計算並構建模式。

    我以逗號分割字符串,在之前和之後計算alpha,並構建了匹配的搜索模式。

    笨重,但可行。

    +0

    @target是什麼? – scsimon

    +0

    對不起,這是一個輸入錯誤 – Greenspark

    +0

    我看到了,但只是一個頭向上我跑你的代碼它,它都是NULL。 – scsimon