如何将nvarchar转换为车号类型

时间:2018-03-14 07:27:12

标签: sql sql-server sql-server-2008

我的数据库中有一些车号,我想改变它的结构

AA11BB => AA-11-BB

A111BB => A-111-BB

AAA111 => AAA-111

我只能通过SQL实现吗?

DDL

declare @a table (
    CN varchar(20)
)

insert  @a
values  ('AA11BB'),
        ('A111BB'),
        ('AAA111')

3 个答案:

答案 0 :(得分:2)

尝试这个简单的查询,看看它是如何工作的。使用patindex可以解决问题,declare @s varchar(10) = 'AAA111' select case when [i2] > 0 then stuff(s, [i2] + 1, 0, '-') else s end [s] from ( select case when [i1] > 0 then stuff(s, [i1] + 1, 0, '-') else s end [s], PATINDEX('%[0-9][A-Z]%', case when [i1] > 0 then stuff(s, [i1] + 1, 0, '-') else s end) [i2] from ( select @s [s], PATINDEX('%[A-Z][0-9]%', @s) [i1] ) a ) a 可以返回给定字符串中正则表达式的索引。

@s

为了在数据库中使用它,请在子查询中用列名替换from MY_TABLE并添加int t,以指定从哪个表列中获取。

答案 1 :(得分:2)

这仅适用于您提供的模式,其他模式不会更改:

declare @a table (
    CN varchar(20)
)

insert  @a
values  ('AA11BB'),
        ('A111BB'),
        ('AAA111')

select  CN,
        case when CN like '[a-z][a-z][0-9][0-9][a-z][a-z]' then left(CN,2) + '-' + substring(CN,3,2) + '-' + right(CN,2)
        --Your other scenarios in here
        else CN
        end
from @a

答案 2 :(得分:0)

有必要制作方法

 DECLARE @txt varchar(100) = 'A1A111';

    WHILE (1 = 1)
    BEGIN 
        DECLARE @a1 int = (SELECT ISNULL(PATINDEX('%[A-Z][0-9]%', @txt), 0));
        DECLARE @a2 int = (SELECT ISNULL(PATINDEX('%[0-9][A-Z]%', @txt), 0));
        DECLARE @Dashnumber int = (SELECT CASE WHEN @a1 > 0 THEN @a1 + 1 WHEN @a2 > 0 THEN @a2 + 1 ELSE 0 END);

        IF (@Dashnumber = 0) BREAK;

        SET @txt = STUFF(@txt, @Dashnumber, 0, '-');        
    END

    SELECT @txt