【问题标题】:Select all rows if @Parameter = NULL如果@Parameter = NULL,则选择所有行
【发布时间】:2020-05-11 22:19:30
【问题描述】:

我有一个带有参数@PolicySymbol 的存储过程,它可以接受多个值。为此,我使用了拆分字符串函数:StringOfStringsToTable

如果用户选择@ControlNo,那么无论为@PolicySymbol 设置什么值,我都想为controlNo 带来数据。

如果@PolicySymbol = NULL 我想为controlNo 带来所有数据,无论它与什么策略符号相关。

这是代码示例:

CREATE TABLE #Test (ControlNo int, policy_symbol varchar(50))

INSERT INTO #Test 
VALUES (1111, 'CSE'), (2222, 'PRE'), (3333, 'CSE'), (4444, 'GLG'),
       (4444, 'PRE'), (4444, 'GLS') 

DECLARE 
    @ControlNo int = 1111,
    @PolicySymbol varchar(50) = NULL 

SELECT DISTINCT ControlNo, policy_symbol
FROM #Test
WHERE ControlNo = COALESCE(@ControlNo, ControlNo)
 -- here, if parameter @PolicySymbol IS NULL I want to include all policy symbols
  AND policy_symbol IN (SELECT String FROM [dbo].[StringOfStringsToTable] (@PolicySymbol, ','))

DROP TABLE #Test

【问题讨论】:

  • 另外你应该用STRING_SPLIT替换[dbo].[StringOfStringsToTable],除非你出于某种原因必须保持古老的兼容性级别。

标签: sql-server tsql stored-procedures sql-server-2017


【解决方案1】:

一个简单、合乎逻辑的OR 就可以了。

WHERE ControlNo = COALESCE(@ControlNo, ControlNo)
-- If parameter @PolicySymbol IS NULL I want to include all policy symbols
AND (
    @PolicySymbol IS NULL
    OR policy_symbol IN (SELECT String FROM [dbo].[StringOfStringsToTable] (@PolicySymbol,','))
)

【讨论】:

  • 正是我接近它的方式 Dale K
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2017-05-11
  • 2014-08-06
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多