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

Get MAX value if column has a certain format

SQL 服务器 2008 R2

我有一个 table 类似于:

Example table:

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

我试图根据列的值是否符合特定格式来获取条件 MAX 值。使用上面的示例,第四条记录 20150001 表示 "good record",因为它包含当前年份和增量的开始。因此,在我的 table 中,被视为 "good" 的记录(受我尝试编写的查询影响的记录)的格式为 "year + increment"。不遵循此格式的前三个不应该以查询为条件,因为它们不匹配此格式并且在计算最大值时不应受制于。那些都是坏记录。在上面的示例中,预期结果将是“20150002”。

MAX 查询编写起来很简单,但是我想知道有一种方法可以清理查询以仅包含满足特定格式的记录,并递增最后四位数字(0001 到 0002)。

TIA!

可以使用isdate函数过滤掉不以有效年份开头的ID Columnisnumeric确保[=]的最后4个字符12=] 是有效的增​​量。根据此条件,您还希望 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

您可以使用正则表达式来验证年份是否正确。我根据您的 0001 和 0002 示例定制的正则表达式的后半部分,可以通过为您期望的每个数字添加“[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;