我正在尝试编写一个 sql 语句,它允许我按顺序检查 sql server 表中的每一行。如果字段的值相隔不止一个,我想返回该字段的值和大于 1 的字段。例如,我的字段如下所示:
值域
V100819493
V100819492
V100819491
V100819232
在这种情况下,唯一大于 1 的值是:
V100819232
V100819491
关于如何在 select 语句中执行此操作的任何想法?
我正在尝试编写一个 sql 语句,它允许我按顺序检查 sql server 表中的每一行。如果字段的值相隔不止一个,我想返回该字段的值和大于 1 的字段。例如,我的字段如下所示:
值域
V100819493
V100819492
V100819491
V100819232
在这种情况下,唯一大于 1 的值是:
V100819232
V100819491
关于如何在 select 语句中执行此操作的任何想法?
如果您不进行基于字符的数学运算,这会变得容易一些;我假设此表中的每个值都由一个字母字符后跟数字组成。
/* 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
您不能直接在 select 语句中执行此操作。最好的办法是使用 ORDER BY 语句选择值,然后遍历它们。对照其前身检查每个值,并查看差异是否 > 1。
理论上,您可以通过编写一个函数将通过检查的每个值插入到辅助(可能是临时的)表中来在 SQL 中完成这一切,但如果可以,请在 C#、Visual Basic 中实现检查,您有什么明显的性能原因。