【问题标题】:Adding Conditional 'And' clause in Where clause在 Where 子句中添加条件 'And' 子句
【发布时间】:2013-12-23 07:11:38
【问题描述】:

我有一个 SQL 查询,我需要在其中有条件地将“AND”子句添加到 WHERE 子句 我有一个变量(@Payment),如果它不为空,则只需要包含在 WHERE 子句中。 我不应该使用 IF 条件。

这是我的代码..

SELECT Fname,lname,city, addressline1, state,zip
FROM table1 
JOIN addresstable on table1.id = addresstable.addid
WHERE state = @state
AND ((@Payment IS NULL) OR (payment LIKE + '%' + @Payment + '%' ) OR (payment LIKE + '%all%' ) )

在示例中,如果 @Payment 为 NULL,那么我不希望将最后一个 'AND' 子句添加到 where 子句中。

【问题讨论】:

  • 您正在使用哪种技术以及您正在使用哪种sql数据库??
  • 你在用asp.net吗??
  • 是的,但为什么重要?,这是一个存储过程
  • 正是……现在你可以做一件事了。取一个@query 变量。并在通过 asp.net 的查询中传递您的条件。所以在你的 sp 中不需要 if 条件。
  • 嗨 Rony,很遗憾我无法从 asp.net 传递任何东西

标签: sql-server tsql


【解决方案1】:

试试这个:

select fname,lname,city, addressline1, state,zip
from table1 
join addresstable on table1.id = addresstable.addid
where state = @state
and (
      (@Payment is null)
      or 
      (payment like @PaymentLike)
)

当您调用此查询时。您需要传递 2 个参数。

  • @Payment
  • @PaymentLike

假设您将“付款”变量传递给@Payment

你会通过:(payment == null) ? "%all%" : ("%" + payment + "%") 到@PaymentLike

当然可以。

【讨论】:

    【解决方案2】:

    您没有提供任何测试数据或架构,因此很难确定,但这可能是您需要的。

    我不确定这个条件OR (payment LIKE + '%all%' ) 的目的,它将限制结果到包含单词“all”的所有行。

    我假设(尽管您没有在问题中说明)您正在尝试返回 addresstable 中的所有行以及 table1 中的任何匹配行。使用left join。如果不是这种情况,您可以将此 AND ((payment LIKE + '%' + COALESCE(@Payment,'') + '%' ) OR (payment LIKE + '%all%' ) ) 移回 WHERE 子句并将 LEFT JOIN 更改为 INNER JOIN。

    --Test data
    DECLARE @table1 AS TABLE(addid INT, payment VARCHAR(20))
    DECLARE @addresstable AS TABLE(addid INT, Fname VARCHAR(20),lname VARCHAR(20),city VARCHAR(20), addressline1 VARCHAR(20), [state] VARCHAR(20),zip VARCHAR(20))
    DECLARE @Payment AS VARCHAR(20)
    DECLARE @state VARCHAR(20)
    SET @state='stateA'
    INSERT INTO @table1 (addid, payment) VALUES(1,'payment 1')
    INSERT INTO @table1 (addid, payment) VALUES(3,'payment 2')
    INSERT INTO @table1 (addid, payment) VALUES(4,'payment 3')
    INSERT INTO @table1 (addid, payment) VALUES(5,'payment 4')
    
    INSERT INTO @addresstable (addid, Fname, lname, city, addressline1, [state], zip) VALUES (1, 'A', 'A', 'A', 'A', 'stateA', 'A')
    INSERT INTO @addresstable (addid, Fname, lname, city, addressline1, [state], zip) VALUES (2, 'B', 'B', 'B', 'B', 'stateA', 'B')
    INSERT INTO @addresstable (addid, Fname, lname, city, addressline1, [state], zip) VALUES (3, 'C', 'C', 'C', 'C', 'stateA', 'C')
    INSERT INTO @addresstable (addid, Fname, lname, city, addressline1, [state], zip) VALUES (4, 'D', 'D', 'D', 'D', 'stateB', 'D')
    INSERT INTO @addresstable (addid, Fname, lname, city, addressline1, [state], zip) VALUES (5, 'E', 'E', 'E', 'E', 'stateB', 'E')
    
    --Query
    SELECT Fname,lname,city, addressline1, state,zip, payment
    FROM @addresstable a
    LEFT JOIN @table1 t
        ON t.addid = a.addid
        AND ((payment LIKE + '%' + COALESCE(@Payment,'') + '%' ) OR (payment LIKE + '%all%' ) )
    WHERE [state] = @state
    

    【讨论】:

    • 您是否发现任何有用的答案?你有任何问题吗?你能提供任何测试数据吗?
    猜你喜欢
    • 2016-12-16
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多