SQL Server 2008 R2
我有一张类似的表:
Example
表:
ID Column
---------------
xxx1234
xxx12345
xxx123456
20150001
我正在尝试获取条件MAX值,具体取决于列的值,具体取决于它是否满足特定格式。使用上面的示例,第四条记录20150001代表“良好记录”,因为它包含当前年份和增量的开始。因此,在我的表中,被认为“好”的记录(那些受我试图编写的查询的记录)具有“年+增量”格式。不遵循此格式的前三个不应该以查询为条件,因为它们与此格式不匹配,并且在计算最大值时不应该受到影响。这些都是糟糕的记录。在上面的示例中,预期结果将是“20150002”。
MAX查询很容易编写,但我想知道一种方法,我可以清理查询,只包括那些符合特定格式的记录,并递增最后四位数(0001到0002)。
TIA!
答案 0 :(得分:1)
您可以使用isdate
功能过滤掉不以有效年份开头的ID Column
,并使用isnumeric
来确保ID Column
的最后4个字符是有效的增量。根据此标准,您还希望len
为8。您可以在where
子句中完成所有这些:
-- load test data
declare @Example_Table table(ID_Column varchar(10))
insert into @Example_Table values
('xxx1234'),
('xxx12345'),
('xxx123456'),
('20150001')
-- return max valid ID_Column
select max(ID_Column) as max_ID_Column
from @Example_Table
where isdate(left(ID_Column,4)) = 1
and isnumeric(right(ID_Column,4)) = 1
and len(ID_Column) = 8
-- increment max valid ID_Column
update @Example_Table
set ID_Column = cast(ID_Column as int) + 1
where isdate(left(ID_Column,4)) = 1
and isnumeric(right(ID_Column,4)) = 1
and len(ID_Column) = 8
select * from @Example_Table
ID_Column
----------
xxx1234
xxx12345
xxx123456
20150002
答案 1 :(得分:1)
您可以使用正则表达式来验证正确的年份。我可以通过添加' [0-9]'对于你期待的每个数字。
DECLARE @Sample VARCHAR(30) = '20150001';
SELECT CASE WHEN (@Sample LIKE '[12][09][0-9][0-9]000[12]') THEN 'Yes' ELSE 'No' END;
SELECT
SUBSTRING(@Sample, 1, 4),
SUBSTRING(@Sample, 5, 4),
CASE WHEN (SUBSTRING(@Sample, 1, 4) LIKE '[12][09][0-9]') THEN 'Yes' ELSE 'No' END,
CASE WHEN (SUBSTRING(@Sample, 5, 4) LIKE '[0-9][0-9][0-9][0-9]') THEN 'Yes' ELSE 'No' END;