sql-server - MS SQL - 我应该用例还有其他方法吗?
问题描述
我需要有关 SQL 代码的帮助。
我有一个看起来像这样的表:
acIdent acSubject acCode
201.2.013 Jusel F-203
201.2.013 Tehnomehanika F-101 (1,5 mm)
我有一个基于某些过滤器创建报告的应用程序。
这就是我想要实现的:
当我选择 acSubject 'Tehnomehanika',然后返回 'F-101 (1,5 mm)' 当我将其留空时,它将是 '',然后返回 top 1 acCode - 'F-203'
它必须只返回一条记录
我尝试过这样的事情,但它不起作用:
declare @acSubject char(30)
set @acSubject = ''
select
case
when acSubject = @acSubject then (select acCode from tHE_SetItemExtItemSubj where acSubject = @acSubject and acIdent = '201.2.013')
else (select top 1 acCode from tHE_SetItemExtItemSubj where acIdent = '201.2.013')
end
from tHE_SetItemExtItemSubj
where acIdent = '201.2.013'
and acSubject = @acSubject
解决方案
当我将其留空时,表示它是null
或''
?
要涵盖这两种情况,您可以使用coalesce()
:
select
case
when coalesce(rtrim(ltrim(@acSubject)), '') <> '' then (
select acCode from tHE_SetItemExtItemSubj
where acSubject = @acSubject and acIdent = '201.2.013'
)
else (
select top 1 acCode from tHE_SetItemExtItemSubj
where acIdent = '201.2.013'
)
end acCode
如果列acSubject
是唯一的并且第一种情况查询仅返回 1 行,这将起作用,否则您也必须使用它top 1
。
编写上述逻辑的另一种方法是:
select top 1 acCode
from tHE_SetItemExtItemSubj
where
acIdent = '201.2.013'
and
(coalesce(rtrim(ltrim(@acSubject)), '') = '' or acSubject = @acSubject)
推荐阅读
- java - Java 等价于 C++ Botan 函数调用
- r - 文件处理时间长
- mysql - AWS Aurora Auto Scaling 导致 mysqld_stmt_execute 的参数不正确
- angular - Angular7 性能
- performance - 如何在flutter中调用接口
- sql-server - SQL Server:在使用双 openquery 的查询中向 concat 参数发出问题
- python - 有没有办法通过索引另一个数据帧中的值来从数据帧中选择值
- reactjs - 如何修复在 highchart 中单击导航器时显示的“-1”值?(当日期范围不用于导航器时)
- python - 在 QTableWidget 中对十六进制数字进行排序的最佳方法
- python - 比较两个列表列表以找到共同值 Python