如果列具有特定格式,则获取MAX值

时间:2015-03-11 17:23:22

标签: sql sql-server sql-server-2008-r2

SQL Server 2008 R2

我有一张类似的表:

Example表:

ID Column
---------------
xxx1234
xxx12345
xxx123456
20150001

我正在尝试获取条件MAX值,具体取决于列的值,具体取决于它是否满足特定格式。使用上面的示例,第四条记录20150001代表“良好记录”,因为它包含当前年份和增量的开始。因此,在我的表中,被认为“好”的记录(那些受我试图编写的查询的记录)具有“年+增量”格式。不遵循此格式的前三个不应该以查询为条件,因为它们与此格式不匹配,并且在计算最大值时不应该受到影响。这些都是糟糕的记录。在上面的示例中,预期结果将是“20150002”。

MAX查询很容易编写,但我想知道一种方法,我可以清理查询,只包括那些符合特定格式的记录,并递增最后四位数(0001到0002)。

TIA!

2 个答案:

答案 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;