SQL Server 2016 How to use a simple Regular Expression in T-SQL?

前端 未结 2 683
粉色の甜心
粉色の甜心 2021-01-29 00:12

I have a column with the name of a person in the following format: \"LAST NAME, FIRST NAME\"

  • Only Upper Cases Allowed
  • Space after comma optional
相关标签:
2条回答
  • 2021-01-29 00:47

    First, case sensitivity depends on the collation of the DB, though with LIKE you can specify case comparisons. With that... here is some Boolean logic to take care of the cases you stated. Though, you may need to add additional clauses if you discover some bogus input.

    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 讨论(0)
  • 2021-01-29 01:06

    The tsql equivalent could look like this. I'm not vouching for the efficiency of this solution.

    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
    

    The optional space is hard to solve, so since it's next to a legal character I'm just replacing with another legal character when it's there.

    TSQL does not provide the kind of 'repeating pattern' of * or + in regex, so you have to count the characters and construct the pattern that many times in your search pattern.

    I split the string at the comma, counted the alphas before and after, and built a search pattern to match.

    Clunky, but doable.

    0 讨论(0)
提交回复
热议问题