我的数据库中有一些车号,我想改变它的结构
AA11BB
=> AA-11-BB
A111BB
=> A-111-BB
AAA111
=> AAA-111
等
我只能通过SQL实现吗?
declare @a table (
CN varchar(20)
)
insert @a
values ('AA11BB'),
('A111BB'),
('AAA111')
答案 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