【问题标题】:ISNULL wildcard '%' search returning no recordsISNULL 通配符 '%' 搜索不返回任何记录
【发布时间】:2023-04-10 16:42:02
【问题描述】:

作为 SQL Server 搜索查询中 WHERE 子句的条件之一,我尝试使用 ISNULL 按 courseId 进行搜索。

当查询以除@currentUserId 之外的所有空值执行时,如下所示,查询不返回任何记录。

我的 SQL:

    DECLARE @currentUserId int = '6'
    DECLARE @searchString nvarchar(MAX) = NULL
    DECLARE @courseId nchar(10) = NULL
    DECLARE @dateFrom date = NULL
    DECLARE @dateTo date = NULL


    SELECT [questionId],[Question].[moduleId],[questionDate],[questionTopic]
    FROM [dbo].[Question],[dbo].[Module],[dbo].[ModuleCourse]
    WHERE [lecturerId] = @currentUserId AND

    ([dbo].[Question].[moduleId] = [dbo].[Module].[moduleId] AND
    [dbo].[Module].[moduleId] = [dbo].[ModuleCourse].[moduleId]) AND

    ([dbo].[Question].[questionTopic] LIKE ISNULL('%' + @searchString + '%','%') OR
    [dbo].[Question].[questionText] LIKE ISNULL('%' + @searchString + '%','%')) AND

    [dbo].[ModuleCourse].[courseId] = ISNULL(@courseId,'%') AND

    ([dbo].[Question].[questionDate] >= ISNULL(@dateFrom,(SELECT MIN([questionDate])
                                                                FROM [dbo].[Question])) AND
    [dbo].[Question].[questionDate] <= ISNULL(@dateTo,(SELECT(GETDATE()))))

当行

    [dbo].[ModuleCourse].[courseId] = ISNULL(@courseId,'%') AND

被注释掉,结果按预期返回。 ([dbo].[ModuleCourse].[courseId] 是 PK;nchar(10))

似乎通配符 % 在这种情况下不起作用;我不知道为什么。 请帮忙...

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    如果@courseId 为空,您会将courseId 与字符串'%' 进行比较。 = 运算符不使用通配符。

    你可以用like代替=,或者把条件写成:

    (@courseId is null or [dbo].[ModuleCourse].[courseId] = @courseId) AND
    

    【讨论】:

    • 嗨,Guffa,LIKE 仍然没有返回任何内容,但条件子句按预期返回了正确的结果。许多人;我想我真的因为这个掉了头发..
    • @user1748443: 啊,nchar(10) 数据类型也有问题,当@courseId 为空时,表达式ISNULL(@courseId,'%') 不返回'%',它返回它填充长度为 10 的空格。您可能想改用 nvarchar(10)
    猜你喜欢
    • 1970-01-01
    • 2020-02-28
    • 2018-01-09
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    相关资源
    最近更新 更多