Sql 如何将nvarchar转换为车号类型

Sql 如何将nvarchar转换为车号类型,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我的数据库里有一些汽车号码,我想这样改变它的结构 AA11BB=>AA-11-BB A111BB=>A-111-BB AAA111=>AAA-111 等等 我只能使用SQL来实现这一点吗 DDL 试试这个简单的查询,看看它是如何工作的。使用patindex可以解决这个问题,它可以返回给定字符串中正则表达式的索引 declare @s varchar(10) = 'AAA111' select case when [i2] > 0 then stuff(s, [i2] + 1, 0, '-

我的数据库里有一些汽车号码,我想这样改变它的结构

AA11BB
=>
AA-11-BB

A111BB
=>
A-111-BB

AAA111
=>
AAA-111

等等

我只能使用SQL来实现这一点吗

DDL
试试这个简单的查询,看看它是如何工作的。使用
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
替换为您的列名,并从MY_表中添加
,以指定从哪个表中获取列。

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

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

有必要制定一种新的方法

 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

这在SQL Server中是很难做到的,您最好在将数据放入表之前处理它。这可以通过正则表达式简单地完成。虽然使用编程语言Python、JavaScript、PHP、Java等会简单得多。但是可以用SQL完成,看看这些文档——是否只有三种可能的场景?如果数据是A111呢?我的答案适用于所有变量
 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