0

我正在尝试编写一个 sql 语句,它允许我按顺序检查 sql server 表中的每一行。如果字段的值相隔不止一个,我想返回该字段的值和大于 1 的字段。例如,我的字段如下所示:

值域

V100819493
V100819492
V100819491
V100819232

在这种情况下,唯一大于 1 的值是:

V100819232
V100819491 

关于如何在 select 语句中执行此操作的任何想法?

4

2 回答 2

5

如果您不进行基于字符的数学运算,这会变得容易一些;我假设此表中的每个值都由一个字母字符后跟数字组成。

/* Create sample data */

declare @table Table (ValueField varchar(40))

insert into @table (ValueField)
select 'V100819493'
UNION SELECT 'V100819492'
UNION SELECT 'V100819491'
UNION SELECT 'V100819232'


/* Join table against itself, using a 'staggered' join to join each record to the previous one. */

select * from 

(
    select 
        ValueField as High_Value, 
        CONVERT(BIGINT,SUBSTRING(valuefield, 2, 800)) as Numeric_Value,
        ROW_NUMBER()  over (order by Valuefield) as line 
    from @table 
) t1

left outer join 
(
    select 
        ValueField as Low_Value, 
        CONVERT(BIGINT,SUBSTRING(valuefield, 2, 800)) as Numeric_Value,
        ROW_NUMBER()  over (order by Valuefield) as line 

    from @table 
)t2 on t1.line -1 = t2.line 


where t1.Numeric_Value - t2.Numeric_Value <> 1
于 2012-08-03T21:28:22.313 回答
0

您不能直接在 select 语句中执行此操作。最好的办法是使用 ORDER BY 语句选择值,然后遍历它们。对照其前身检查每个值,并查看差异是否 > 1。

理论上,您可以通过编写一个函数将通过检查的每个值插入到辅助(可能是临时的)表中来在 SQL 中完成这一切,但如果可以,请在 C#、Visual Basic 中实现检查,您有什么明显的性能原因。

于 2012-08-03T21:06:30.460 回答