破折号后删除零

时间:2019-01-26 04:14:06

标签: 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
       @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

7 个答案:

答案 0 :(得分:0)

这应该可以,但是无法测试。.

CreateDialogIndirectParam(...)
ShowWindow(...)

MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
    if(hDlgWnd == 0 || !IsDialogMessage(hDlgWnd, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

答案 1 :(得分:0)

使用以下代码获取结果。

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', '')

答案 2 :(得分:0)

下面的示例仅使用CASELIKE来检查字符串是否以破折号和4位数字结尾。

并且一个INT的连续符号不会添加前导零。

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;

返回:

in          out
012345-0001 012345-1
001234-0011 001234-11
123456-0111 123456-111
000012-1234 000012-1234

测试here

使用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;

答案 3 :(得分:0)

尝试一下:

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

在db <>小提琴上尝试:link

答案 4 :(得分:0)

另一个选择是将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

答案 5 :(得分:0)

我注意到大多数解决方案都假设文本的每个部分(看起来像是一个数字)的长度为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

答案 6 :(得分:0)

使用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;

查询将首先通过简单的字符串替换将您的012345-001转换为<x>012345</x><x>001</x>。真正的魔力发生在XQuery表达式中。