Sql server 同一列的Where子句中的多个条件

Sql server 同一列的Where子句中的多个条件,sql-server,tsql,Sql Server,Tsql,如何为以下条件编写MS SQL语句 我有一个表单,允许用户在范围内输入日期(fromDate&toDate)和ID(fromID&toID)。所有字段可以为空,或仅输入from或to字段或同时输入from和to字段。选择基于要选择的输入值。以下是为输入的值签入where子句的条件 未输入值=>跳过所有条件 仅在fromDate中输入的值=>Date=frDate 仅在toDate中输入的值=>fromDate和toDate之间的日期 条件也应用于ID字段。 非常感谢您的建议。 提前感谢。您可以使

如何为以下条件编写MS SQL语句

我有一个表单,允许用户在范围内输入日期(
fromDate
&
toDate
)和ID(
fromID
&
toID
)。所有字段可以为空,或仅输入from或to字段或同时输入from和to字段。选择基于要选择的输入值。以下是为输入的值签入where子句的条件

未输入值=>跳过所有条件

仅在fromDate中输入的值=>Date=frDate

仅在toDate中输入的值=>fromDate和toDate之间的日期

条件也应用于ID字段。

非常感谢您的建议。
提前感谢。

您可以使用动态查询解决您的问题。你的问题不是很清楚。在这里,我给你一个解决方案,它将帮助你解决你的问题。试试这个:

1。在存储过程中创建动态查询

        CREATE PROCEDURE sp_YourSPName
    /* Input Parameters */
        @FromDate DATETIME ,
        @ToDate DATETIME 
    AS
        SET NOCOUNT ON
        /* Variable Declaration */
        DECLARE @SQLQuery AS NVARCHAR(4000)
        DECLARE @ParamDefinition AS NVARCHAR(2000) 

        /* Build the Transact-SQL String with the input parameters */ 
        SET @SQLQuery = 'Select * From YourTableName where (1=1) ' 

        /* check for the condition and build the WHERE clause accordingly */
        IF (@FromDate IS NOT NULL)
           AND (@ToDate IS NOT NULL)
            SET @SQLQuery = @SQLQuery + 
                ' And (YourDate BETWEEN @FromDate AND @ToDate)'

        IF (@FromDate IS NULL)
           AND (@ToDate IS NOT NULL)
            SET @SQLQuery = @SQLQuery + ' And (YourDate <= @ToDate)' 

        IF (@FromDate IS NOT NULL)
           AND (@ToDate IS NULL)
            SET @SQLQuery = @SQLQuery + ' And (YourDate = @FromDate)'


        /* Specify Parameter Format for all input parameters included 
        in the stmt */
        SET @ParamDefinition = '@StartDate DateTime,
                            @EndDate DateTime'
        /* Execute the Transact-SQL String with all parameter value's  Using sp_executesql Command */

        EXECUTE sp_Executesql @SQLQuery,
             @ParamDefinition,
             @FromDate,
             @ToDate

        IF @@ERROR <> 0
            GOTO ErrorHandler

        SET NOCOUNT OFF
        RETURN(0)

        ErrorHandler :
        RETURN(@@ERROR)
    GO

下面是一个示例,而不是您可以尝试使用CASE语句将其置于您的方式中的确切查询

SELECT values     
FROM Table   
WHERE CASE 
     WHEN fromDate = null & todate = null THEN 
     WHEN fromDate != null & toDate != null THEN Date between fromDate and toDate
     WHEN fromDate != null THEN  Date = frDate
     WHEN toDate != null THEN Date = toDate

您可以使用IS NULL检查参数是否有值

SELECT * FROM Table
    WHERE (@FromDate IS NULL OR Date > @FromDate) AND (@ToDate IS NULL OR Date < @ToDate)
从表中选择*
其中(@FromDate为NULL或Date>@FromDate)和(@ToDate为NULL或Date<@ToDate)

Id将使用相同类型的查询

“任何建议”都不是问题。发布问题时,您需要提出一个问题,以及(重要的)一个特定的问题。然而,目前还不太清楚,这听起来像是在询问Catch-all查询:我认为最好在服务器端动态构建where子句。听起来像是很多,到目前为止你都尝试了什么???谢谢你的回复。它确实有用。但我之前做过,发现查询语句的执行非常冗长和缓慢。
SELECT * FROM Table
    WHERE (@FromDate IS NULL OR Date > @FromDate) AND (@ToDate IS NULL OR Date < @ToDate)