当前位置:网站首页>根据某一指定的表名、列名及列值来向前或向后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
边栏推荐
猜你喜欢

Configure NPM

Custom time format (yyyy-mm-dd HH: mm: SS week x)

SAP PI/PO登录使用及基本功能简介

h5本地存储数据sessionStorage、localStorage

Reflection on the systematic design of Android audio and video caching mechanism

页面实时显示当前时间

中间人环境mitmproxy搭建

防抖和节流

BTree、B+Tree和HASH索引

SAP pi / PO rfc2restful publishing RFC interface is a restful example (proxy indirect method)
随机推荐
SAP ECC连接SAP PI系统配置
13. User and authority management
防抖和节流
基于NLP的软件安全研究(二)
c#读取INI文件和向ini文件写入数据
反思|开启B站少女心模式,探究APP换肤机制的设计与实现
npm 安装踩坑
SAP pi / PO rfc2soap publishes RFC interface as WS example
C# SmoothProgressBar自定义进度条控件
简易随机点名抽奖(js下编写)
SAP Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃。
MySQL storage engine
数组扁平化
ABAP 从CDS VIEW 发布OData Service示例
FSM finite state machine
SAP PI/PO rfc2Soap 发布rfc接口为ws示例
redis连接出错 ERR AUTH <password> called without any password configured for the default user.
Learn to use search engines
What are the total number of all courses of Mr. Tang Xiaoyang, who is very popular in CSDN (question mark)
SAP TRANSLATE使用数据对象掩码示例