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