【问题标题】:Get MAX value if column has a certain format如果列具有某种格式,则获取 MAX 值
【发布时间】:2015-05-13 15:15:56
【问题描述】:

SQL Server 2008 R2

我有一张类似这样的表:

Example表:

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

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

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

TIA!

【问题讨论】:

  • 会一直是xx.. 还是会出现其他一些字符
  • 所有数字都是“好”的?从 myTable 中选择 MAX(CONVERT(INT,ID))+1 其中 ISNUMERIC(ID) 1
  • 其他字符会在那里。
  • @mxix 我马上去测试
  • @mxix 返回“将 nvarchar 值 'xxxx' 转换为数据类型 int 时转换失败。”

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


【解决方案1】:

您可以使用isdate 函数过滤掉不以有效年份开头的ID Columns,并使用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

【讨论】:

  • 当增量达到 005、006 等时,这是否有效?
  • IsNumeric 将包含符号 '.'和“-”,试试“2015.0001”和“-2015.0001”。
  • @jtimperley,这两个都不符合 where 标准。
  • 是的,这将继续增加到 YYYY9999。之后,它会增加年份,这是一个限制。
【解决方案2】:

您可以使用正则表达式来验证正确的年份。我为您的 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;

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 2013-01-24
    • 2020-05-16
    • 2016-04-09
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多