当前位置:网站首页>根据某一指定的表名、列名及列值来向前或向后N条查相关列值的SQL自定义标量值函数
根据某一指定的表名、列名及列值来向前或向后N条查相关列值的SQL自定义标量值函数
2022-04-23 06:27:00 【大可山人】
有时需要根据某一指定的列的值来向前或向后N条查相关的列值,那么用此SQL自定义标量值函数可以取得相关的SQL语句:
ALTER FUNCTION GetPreviousNextCodeSql
(
@tableName varchar(50),
@codeFieldName varchar(50),
@currentCode varchar(50),
@idKey varchar(50),
@step int
) --('B_ProcessList','process_code','OCV3','processid',-1)
RETURNS varchar(2000)
AS
BEGIN
DECLARE @result varchar(50), @sql varchar(2000)
set @result=''
--判断是否有idx列名,如有,使用idx排序,否则使用processid排序
--if exists(select 1 from syscolumns where name='idx' and id=object_id(@tableName))
--Begin
set @sql = 'select t.'+ @codeFieldName +' from ('
set @sql = @sql +'select row_number() over (order by ' + @idKey +' asc) as p, ' + @codeFieldName +' from ' + @tableName
set @sql = @sql +') as t'
set @sql = @sql + ' where t.p =('
set @sql = @sql +' select top 1 m.p'
IF @step>0
set @sql = @sql +'+'
ELSE
set @sql = @sql
set @sql = @sql + convert(varchar,@step)
set @sql = @sql +' from ('
set @sql = @sql +' select row_number() over (order by ' + @idKey +' asc) as p, ' + @codeFieldName +' from ' + @tableName
set @sql = @sql +') as m where ' + @codeFieldName + '=''' + @currentCode +''')'
return @sql
--End
--return ''
END
调用时(举例):
--查上面第二条记录
select dbo.GetPreviousNextCodeSql('B_ProcessList','process_code','OCV3','processid',-2)
--查后面第二条记录
select dbo.GetPreviousNextCodeSql('B_Process_Flow','flow_code','GY002','id',+1)
调用后生成的语句类似如下:
select t.process_code from (select row_number() over (order by processid asc) as p, process_code from B_ProcessList) as t where t.p =( select m.p-2 from ( select row_number() over (order by processid asc) as p, process_code from B_ProcessList) as m where process_code='OCV3')
关键语句:
--查上一条工序记录
select t.process_code from (
select row_number() over (order by processid asc) as p, process_code from B_ProcessList
) as t
where t.p =(
select m.p-1 from (
select row_number() over (order by processid asc) as p, process_code from B_ProcessList
) as m where process_code='OCV3')
当然也可以使和类似的语句来实现,但灵活性不如上面的做法,因为只能向上或向下查前/后一条:
--查下一条工序记录
select process_code from B_ProcessList where processid=
(select max(processid) from B_ProcessList where processid<
(select processid from B_ProcessList where process_code='OCV3'))
--查上一条工序记录
select process_code from B_ProcessList where processid=
(select min(processid) from B_ProcessList where processid>
(select processid from B_ProcessList where process_code='OCV3'))
OK。
版权声明
本文为[大可山人]所创,转载请带上原文链接,感谢
https://blog.csdn.net/johnsuna/article/details/81745440
边栏推荐
猜你喜欢

Implementation of MySQL persistence

反思 | Android 音视频缓存机制的系统性设计

ABAP CDS VIEW WITH ASSOCIATION示例

canvas学习第一篇

SAP PI/PO Soap2Proxy 消费外部ws示例

防抖和节流

SAP PI / Po rfc2restful Publishing RFC interface as restful examples (proxy indirect)

'NPM' is not an internal or external command, nor is it a runnable program or batch file

中间人环境mitmproxy搭建

SAP PI/PO rfc2Soap 发布rfc接口为ws示例
随机推荐
简单理解==和equals,String为什么可以不用new
BTREE, B + tree and hash index
[self motivation series] you'll never be ready
8.分页查询
驼峰命名对像
SAP RFC_CVI_EI_INBOUND_MAIN BP主数据创建示例(仅演示客户)
SAP 导出Excel文件打开显示:“xxx“的文件格式和扩展名不匹配。文件可能已损坏或不安全。除非您信任其来源,否则请勿打开。是否仍要打开它?
SAP PI/PO rfc2Soap 发布rfc接口为ws示例
Implementation of MySQL persistence
Authorization+Token+JWT
MySQL index
SAP SALV14 后台输出SALV数据可直接保存文件,发送Email(带排序、超链接、筛选格式)
SAP DEBUG调试FOR IN、REDUCE等复杂的语句
State synchronization and frame synchronization
npm 安装踩坑
ABAP 从CDS VIEW 发布OData Service示例
将单行文字自动适应到目标矩形框内
设置了body的最大宽度,但是为什么body的背景颜色还铺满整个页面?
Moment. Format of format method function in JS
SAP TRANSLATE使用数据对象掩码示例