【问题标题】:sql isnull with string as option带有字符串作为选项的 sql isnull
【发布时间】:2016-01-07 19:27:17
【问题描述】:

我有这部分查询,我正在执行此操作。

FROM #Table2 WHERE Attribute = ISNULL('+@Attrb+', Attribute)) AS D

显然这对我不起作用,因为@Attr 可以带入字符串或可以为空。有没有更好的方法来处理这个? 我需要的是,这是一个传递给这个存储过程的参数。有两种可能的选择(或第三种为空)。我允许用户输入。你会如何解决这个问题?

谢谢。

【问题讨论】:

  • ISNULL function 执行以下操作: 检查第一个参数是否为IS NULL;如果是则返回第二个参数,否则返回第一个。由于您的第一个参数不是NULL,它总是会返回第二个。总帐。
  • 如果您想检查 @attrb 变量值是否为 null,您可以使用如下查询:WHERE (@Attrb IS NOT NULL AND Attribute = @Attrb)
  • 为了澄清我的目标,我想接受空值和其他两个文本字符串。如果用户什么都不提供(一个空字符串),我将显示所有没有过滤的记录。

标签: sql-server stored-procedures


【解决方案1】:
FROM #Table2 ' + ISNULL('WHERE Attribute = ''' + NULLIF(@Attrb,'') + '''', '') + ') AS D

示例

CREATE TABLE #Table2 (Attribute VARCHAR(MAX))
INSERT INTO #Table2 VALUES
('Id'),('Class'),('Name')

DECLARE @Attrb VARCHAR(MAX),
        @SQL VARCHAR(MAX)

--Attrb is NULL
SET @SQL = ' SELECT * FROM #Table2 ' + ISNULL('WHERE Attribute = ''' + NULLIF(@Attrb,'') + '''', '')
EXEC(@SQL)

/*Result

  Attribute
  ---------
  Id
  Class
  Name
*/

--Give Attrb a value
SET @Attrb = 'Class'
SET @SQL = ' SELECT * FROM #Table2 ' + ISNULL('WHERE Attribute = ''' + NULLIF(@Attrb,'') + '''', '')
EXEC(@SQL)

/*Result

  Attribute
  ---------
  Class
*/

【讨论】:

  • 为了澄清我的目标,我想接受空值和其他两个文本字符串。如果用户什么都不提供(一个空字符串),我将显示所有没有过滤的记录。
  • NULLIF(@Attrb,'') 将解决空字符串问题
  • NULL 值是否选择具有 NULL 属性值的记录? @Eclipse
  • 没有空属性值。它是“组件”或“非补偿”。因此,当用户什么都不提供(空字符串)时,我希望显示所有记录,换句话说,需要忽略 where 语句。只允许用户进行过滤。如果我可以有一个下拉菜单供他们选择,那就更好了。
  • 那么它应该对你有用.. 如果@Attrb 为 NULL 或 Empty,where 语句将从查询中排除
【解决方案2】:

您没有指明您使用的是什么版本的 SQL Server,但如果您使用的是 2012 或更高版本,您可能需要查看iif

测试示例:

declare @Attrib varchar(20)

set @Attrib = NULL

select iif(@Attrib is null,'Null Result',@Attrib)

【讨论】:

  • 使用 SQL Server 2008。
【解决方案3】:

我不确定字符串文字在那里做什么。我很确定你想要这样的东西。

WHERE Attribute = ISNULL(@Attrb, Attribute)

或者,如果您尝试处理 NULL 或空字符串,您可以使用 NULLIF

WHERE Attribute = ISNULL(NULLIF(@Attrb, ''), Attribute)

--编辑--

修改它以使用动态 sql 非常简单。

'WHERE Attribute = ISNULL(NULLIF(' + ISNULL(@Attrb, Attribute) + ', ''''), Attribute)'

【讨论】:

  • 我可能错了,但它看起来像是动态 sql 的一部分。在 FROM 之前放一个 ' 会更有意义
  • 我没有从 OP 中看到任何迹象表明这是动态 sql,但 ' + 的东西肯定让它看起来有可能。
  • 肖恩,我正在使用动态 sql。所以我尝试了你的解决方案,它作为标准 sql 语句工作,但试图让它在我的动态语句中工作。
猜你喜欢
  • 2011-06-09
  • 2019-06-20
  • 1970-01-01
  • 2016-08-21
  • 2012-01-20
  • 2013-01-28
  • 1970-01-01
  • 2013-07-16
  • 2020-05-09
相关资源
最近更新 更多