Sql 破折号后删除零
我在一列中有如下格式的数据:Sql 破折号后删除零,sql,tsql,Sql,Tsql,我在一列中有如下格式的数据: 012345-0001 001234-0011 123456-0111 000012-1234 我需要一个查询来返回如下数据: 012345-1 001234-11 123456-111 000012-1234 我已经创建了一个函数来删除不同数量的前导零,但不知道在破折号之后如何做 谢谢你的帮助 功能: DECLARE @Output varchar(8000), @Value int, @Input varchar(8000) SELECT
012345-0001
001234-0011
123456-0111
000012-1234
我需要一个查询来返回如下数据:
012345-1
001234-11
123456-111
000012-1234
我已经创建了一个函数来删除不同数量的前导零,但不知道在破折号之后如何做
谢谢你的帮助
功能:
DECLARE @Output varchar(8000), @Value int, @Input varchar(8000)
SELECT
@Value = CASE
WHEN @Input LIKE '%[A-Z]%' THEN -1
ELSE CONVERT(int, RIGHT([matcode], 4))
END
FROM matter
WHERE matcode = @Input
IF (@Value = -1) SET @Output = @Input
ELSE IF (@Value BETWEEN 1 AND 999) SET @Output = RIGHT('000' + CONVERT(varchar(3), @Value), 3)
ELSE IF (@Value BETWEEN 1000 AND 9999) SET @Output = RIGHT('0000' + CONVERT(varchar(4), @Value), 4)
ELSE SET @Output = @Input
RETURN @Output
这应该是可行的,但无法测试它
DECLARE @Output varchar(8000), @Value int, @Input varchar(8000)
SELECT
@Value = CASE
WHEN @Input LIKE '%[A-Z]%' THEN -1
ELSE CONVERT(int, RIGHT([matcode], 4))
END
FROM matter
WHERE matcode = @Input
IF (@Value = -1) SET @Output = @Input
ELSE SET @Output = CONCAT( LEFT(@Input, 7), @Value )
RETURN @Output
使用下面的代码获得结果
select substr('001234-0011', 0, instr('001234-0011', '-') ) ||
replace(substr('001234-0011', instr('001234-0011', '-')+1), '0', '') from dual;
如果像您提到的tSql那样使用SqlServer,请使用此选项
select substring('001234-0011', 0, CHARINDEX('-', '001234-0011')) + replace(substring('001234-0011', CHARINDEX('-', '001234-0011'), 10), '0', '')
下面的示例仅使用一个
大小写
和一个LIKE
来检查字符串是否以破折号和4位数字结尾
INT的concat不加前导零
declare @Table table (col varchar(30));
insert into @Table (col) values
('012345-0001'),
('001234-0011'),
('123456-0111'),
('000012-1234');
select col as [in],
(case
when col like '%-0[0-9][0-9][0-9]'
then concat(left(col,len(col)-4), cast(right(col,4) as int))
else col
end) as [out]
from @Table;
返回:
测验
使用varchar变量,它可以如下使用:
DECLARE @Input varchar(30), @Output varchar(30);
SET @Input = '012345-0001';
SET @Output = case when @Input like '%-0[0-9][0-9][0-9]' then concat(left(@Input,len(@Input)-4), cast(right(@Input,4) as int)) else @Input end;
试试这个:
declare @var varchar(30)
set @var = '012345-0021'
select concat(
left(@var,charindex('-',@var)-1), --keeps first side 'as is'
'-',
right( --for the second part
right(@var,charindex('-',reverse(@var))),
charindex( '0', reverse(right(@var,4)) )-1 --finds the position first '0' of the reversed string (the last 0)
)
) as output
输出:012345-21
在dbfiddle上尝试它:还有一个选项是将parsename()与concat一起使用 示例
Select *
,NewValue = concat( left(YourCol,charindex('-',YourCol+'-') )
,try_convert(int,parseName(replace(YourCol,'-','.'),1))
)
from YourTable
返回
YourCol NewValue
012345-0001 012345-1
001234-0011 001234-11
123456-0111 123456-111
000012-1234 000012-1234
我注意到大多数解决方案都假设文本的每一部分看起来像一个数字,长度为4个字符 下面是另一个基于PARSENAME函数的解决方案,它更灵活一些:
declare @Table table (col varchar(30));
insert into @Table (col) values
('012345-0001'),
('001234-0011'),
('123456-0111'),
('000012-1234')
SELECT
PARSENAME(REPLACE(col,'-','.'), 2) +
'-' +
CONVERT(VARCHAR(10), CONVERT(INT, PARSENAME(REPLACE(col,'-','.'), 1)))
FROM @Table
使用XQuery
的一行程序怎么样:
DECLARE @mockup TABLE (YourValue VARCHAR(30));
INSERT INTO @mockup VALUES
('012345-0001'),
('001234-0011'),
('123456-0111'),
('000012-1234');
--这就是问题所在
SELECT YourValue
,CAST('<x>' + REPLACE(YourValue,'-','</x><x>') + '</x>' AS XML)
.value('concat(/x[1],"-",string(xs:int(/x[2])))','varchar(30)')
FROM @mockup;
选择您的值
,CAST(“”+REPLACE(您的值“-”,“”)+”作为XML)
.value('concat(/x[1],“-”,string(xs:int(/x[2])),'varchar(30)'))
来自@mockup;
查询将首先通过简单的字符串替换将
012345-001
转换为012345001
。真正的神奇发生在XQuery
表达式中。向我们展示您的function@matthewpageAdded function破折号右侧的值是否始终为有效整数?如果是这样的话,正如马修·佩奇所建议的,您可以将其转换为整数并返回到字符串。提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。请注意,tsql
缩小了选择范围,但没有指定数据库。要测试各种DBMS的SQL代码,我建议使用以下方法:如果您发布整个地址,您可以传递一个可测试的代码片段:ex(与您的代码一起)
SELECT YourValue
,CAST('<x>' + REPLACE(YourValue,'-','</x><x>') + '</x>' AS XML)
.value('concat(/x[1],"-",string(xs:int(/x[2])))','varchar(30)')
FROM @mockup;