我的数据列格式如下:
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
答案 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)
下面的示例仅使用CASE
和LIKE
来检查字符串是否以破折号和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
表达式中。