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;