T-SQL - 根据来自多个表的值扩展本地参数中的文本,而不使用 if 语句

Posted

技术标签:

【中文标题】T-SQL - 根据来自多个表的值扩展本地参数中的文本,而不使用 if 语句【英文标题】:T-SQL - Expanding text in local parameter based on values from multiple tables, without using if statements 【发布时间】:2021-05-24 12:09:08 【问题描述】:

问题如下:我有一些参数

Declare @testParam nvarchar(max) = '',
Declare @ID int = 3

我有许多复杂的表,它们都有一个名称不同的列,但类似于BIT 类型的某种状态。

ID Status some other values...
1 0 ...
2 1 ...
3 1 ...
4 1 ...

我想在每次Status 值 = 1 时为匹配我的ID 的记录扩展@testParam 的文本。我需要添加到此@testParam 的文本对于每个表都会有所不同。

例如:

select @testParam = @testParam + 'Full capacity ' 
from CapacityTable
where CapacityStatus= 1 and ID = @ID

select @testParam = @testParam + 'Not enough coal ' 
from CoalTable
where LackOfCoal = 1 and ID = @ID

select @testParam = @testParam + 'Too low temperature' 
from OvenTable 
where OvenStatus = 1 and ID = @ID

select @testParam as Result

如果所有选择语句都满足条件,我期望的结果如下:

Result
Full capacity Not enough coal Too low temperature

我知道我可以通过使用许多 IF 语句来实现这一点,但我需要这个查询尽可能地优化。除非使用 IF 语句在执行时间上没有太大变化,否则我正在寻找替代解决方案。

【问题讨论】:

不太明白你在这里问什么,你能添加一些示例数据和你想要实现的输出吗? @iamdave 添加了您的要求:) 在我看来,在您尝试“优化”以实现某些未定义的目标之前,您应该首先寻找一个可以正常工作的解决方案。字符串聚合是一个常见主题 - TSQL 在当前版本中有string_agg() - 存在替代方案,并且已多次针对旧版本发布。 也许添加计算列或其他转换技术以将数值关联到字符串描述也是一个好主意。您不想在需要引用它们的每个查询中继续编写这些相同的描述。 这能回答你的问题吗? How to use GROUP BY to concatenate strings in SQL Server? 另请参阅 ***.com/questions/66317406/… 了解为什么不使用您拥有的语法 【参考方案1】:

我找到了一种通过使用 case 子句来完成它的方法,但是如果有更好的方法(在性能方面)我想知道它。

使用 case 子句的解决方案:

select @testParam = @testParam + 
case 
   when CapacityStatus = 1
   then 'Full capacity ' 
   else ''
end
from CapacityTable
where ID = @ID

以类比的方式为您需要的每个表应用上面的代码。

【讨论】:

以上是关于T-SQL - 根据来自多个表的值扩展本地参数中的文本,而不使用 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

使用 T-SQL 中的一个参数将多个值插入多行

如何基于 T-SQL 中的函数使用 COLLATE? [复制]

T-SQL编程 —— 用户自定义函数(标量函数)

数据库表的管理(使用T-SQL语句)

基于 Azure 流分析 T-SQL 查询中的另一个参数动态拆分参数

用T-SQL语句自定义一表值函数