如何在SQL字符串中放入"if子句"?

Joh*_*upe 175 mysql sql

所以这就是我想在我的MySQL数据库上做的事情.

我想要做:

SELECT *
    FROM itemsOrdered
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID'
        AND status = 'PENDING'
Run Code Online (Sandbox Code Playgroud)

如果那不会返回任何行,那么if(dr.HasRows == false)我现在可以UPDATEpurchaseOrder数据库中创建一个:

UPDATE purchaseOrder
    SET purchaseOrder_status = 'COMPLETED'
    WHERE purchaseOrder_ID = '@purchaseOrder_ID'
Run Code Online (Sandbox Code Playgroud)

我怎样才能让这个过程变得更短?

Gor*_*off 373

对于您的特定查询,您可以:

UPDATE purchaseOrder
    SET purchaseOrder_status = 'COMPLETED'
    WHERE purchaseOrder_ID = '@purchaseOrder_ID' and
          not exists (SELECT *
                      FROM itemsOrdered WHERE purchaseOrder_ID = '@purchaseOrdered_ID' AND status = 'PENDING'
                     )
Run Code Online (Sandbox Code Playgroud)

但是,我可能会猜到你正在更高层次上进行循环.要设置所有这些值,请尝试以下操作:

UPDATE purchaseOrder
    SET purchaseOrder_status = 'COMPLETED'
    WHERE not exists (SELECT 1
                      FROM itemsOrdered
                      WHERE itemsOrdered.purchaseOrder_ID = purchaseOrder.purchaseOrdered_ID AND
                            status = 'PENDING'
                      limit 1
                     )
Run Code Online (Sandbox Code Playgroud)

  • 实际上在MySQL中,假设itemsOrdered.purchaseOrder_ID上有索引,相关子查询应该是最有效的方法之一. (24认同)
  • @eggyal...我同意如果没有索引,相关版本的性能可能不如连接(取决于各种因素,例如行的乘法).但是,对于索引,它应该比连接更好,因为它应该在第一次匹配时停止索引扫描.请查看http://dev.mysql.com/doc/refman/5.5/en/subquery-optimization-with-exists.html. (7认同)

egg*_*yal 49

您可以使用多表UPDATE语法来实现ANTI-JOIN之间purchaseOrderitemsOrdered:

UPDATE purchaseOrder p LEFT JOIN itemsOrdered i
    ON p.purchaseOrder_ID = i.purchaseOrder_ID
   AND i.status = 'PENDING'
SET    p.purchaseOrder_status = 'COMPLETED'
WHERE  p.purchaseOrder_ID = '@purchaseOrder_ID'
   AND i.purchaseOrder_ID IS NULL
Run Code Online (Sandbox Code Playgroud)


Ran*_*ngh 43

由于MySQL不支持if exists(*Your condition*) (*Write your query*),您可以通过这样编写来实现'if子句':

(*Write your insert or update query*) where not exists (*Your condition*)
Run Code Online (Sandbox Code Playgroud)


小智 23

您还可以使用以下查询来检查记录是否存在,然后更新它:

if not exists(select top 1 fromFROM itemsOrdered
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID'
        AND status = 'PENDING' )
Begin

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED'
    WHERE purchaseOrder_ID = '@purchaseOrder_ID

End
Run Code Online (Sandbox Code Playgroud)


小智 20

Select FROM t1
    WHERE s11 > ANY
        (SELECT col1,col2 FROM t2
            WHERE NOT EXISTS
                (SELECT * FROM t3
                    WHERE ROW(5*t2.s1,77)=
                        (SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM
                            (SELECT * FROM t5) AS t5)));
Run Code Online (Sandbox Code Playgroud)

  • 我很难看到这根本问题是如何回答的? (4认同)
  • 我想这是我们可以使用“SQL”做的其他事情的一个例子 (3认同)
  • 恭喜,您的代码已被选为混淆代码。 (2认同)

小智 11

if not exists(select top 1 fromFROM itemsOrdered
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID'
        AND status = 'PENDING' )
Begin

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED'
    WHERE purchaseOrder_ID = '@purchaseOrder_ID

End
Run Code Online (Sandbox Code Playgroud)

  • 如果你解释答案也会很棒,代码只有答案对未来的用户没用 (7认同)

Lal*_*iya 7

它可以帮助你在sql服务器中使用Merge插入,更新和删除基于sql server中的匹配语句,例如它可以帮助你https://technet.microsoft.com/en-us/library/bb522522(v=sql. 105)的.aspx


Ami*_*ati 5

如果表包含数百万条记录,则以下查询将快速运行。

UPDATE PO
SET PO.purchaseOrder_status = 'COMPLETED'
FROM purchaseOrder PO
LEFT OUTER JOIN itemsOrdered IOD ON IOD.purchaseOrder_ID = PO.purchaseOrdered_ID and IOD.status = 'PENDING'
WHERE IOD.purchaseOrder_ID IS NULL
Run Code Online (Sandbox Code Playgroud)