Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在sql语句中使用`OR`条件?_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

如何在sql语句中使用`OR`条件?

如何在sql语句中使用`OR`条件?,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我想在下面的sql语句中使用'OR'条件,请帮助我这样做 SELECT DATE, SecurityId FROM StateStreet INNER JOIN Securities ON StateStreet.SecurityID = Securities.securityid AND ( (SecurityName LIKE '% R V %' AND Quantity < 0 AND

我想在下面的sql语句中使用'OR'条件,请帮助我这样做

   SELECT DATE, SecurityId
    FROM StateStreet
    INNER JOIN Securities ON StateStreet.SecurityID = Securities.securityid
    AND (     (SecurityName LIKE '% R V %'
               AND Quantity < 0
               AND PortfolioId =@portfolioID)
           OR (SecurityName NOT LIKE '% R V %'
               AND Quantity > 0
               AND PortfolioId=@PortfolioID)
           OR (Value = Quantity
               AND Securities.PortfolioId =@PortfolioID) 
         )
   WHERE CONVERT(DATETIME,PeriodEndDate) = @PositionDate 
选择日期、安全ID
来自史泰街
StateStreet.SecurityID=Securities.SecurityID上的内部联接证券
和((SecurityName,如“%R V%”
数量<0
和PortfolioId=@PortfolioId)
或(SecurityName与“%R V%”不同
和数量>0
和PortfolioId=@PortfolioId)
或(值=数量)
和证券。PortfolioId=@PortfolioId)
)
其中CONVERT(DATETIME,PeriodEndDate)=@PositionDate

请帮助我使用上述声明中的或条件,我需要检查或条件中的3个声明

看起来您忘记了
WHERE
子句:

SELECT 
    DATE,
    SecurityId              
FROM
    StateStreet 
INNER JOIN
    Securities ON StateStreet.SecurityID =  Securities.securityid 
WHERE
    (SecurityName LIKE '% R V %' AND Quantity < 0  AND PortfolioId = @portfolioID)
OR
    (SecurityName NOT LIKE '% R V %' AND Quantity > 0  AND PortfolioId = @PortfolioID)
OR
    (Value = Quantity AND Securities.PortfolioId = @PortfolioID)
选择
日期,
安全ID
从…起
史泰街
内连接
StateStreet上的证券.SecurityID=Securities.SecurityID
哪里
(SecurityName如“%R V%”,数量<0,PortfolioId=@PortfolioId)
或
(SecurityName与“%R V%”不同,数量大于0,PortfolioId=@PortfolioId)
或
(值=数量和证券。PortfolioId=@PortfolioId)

这是您第二次发布相同的问题

您正在使用或设置条件

要么您不了解优先级、搜索条件,要么数据不是您假设的

顺序是:
按位(您没有这些选项)
()


分解查询

SELECT DATE, SecurityId, SecurityName, Quantity, Value, PortfolioId
FROM StateStreet
INNER JOIN Securities 
   ON StateStreet.SecurityID = Securities.securityid
WHERE CONVERT(DATETIME,PeriodEndDate) = @PositionDate 
然后
您可以将AND-PortfolioId=@PortfolioId向上拉,就像它在每个中一样,或者像AND一样

SELECT DATE, SecurityId, SecurityName, Quantity, Value, PortfolioId
FROM StateStreet
INNER JOIN Securities 
   ON StateStreet.SecurityID = Securities.securityid 
  AND PortfolioId = @portfolioID
WHERE CONVERT(DATETIME,PeriodEndDate) = @PositionDate 

SELECT DATE, SecurityId, SecurityName, Quantity, Value, PortfolioId
FROM StateStreet
INNER JOIN Securities 
   ON StateStreet.SecurityID = Securities.securityid 
  AND PortfolioId = @portfolioID
  AND (      Value = Quantity
        OR ( SecurityName LIKE '% R V %' )
      )
WHERE CONVERT(DATETIME,PeriodEndDate) = @PositionDate

考虑到表和所有列都存在,您的语法似乎没有问题。那你有什么问题?也许您可以描述您期望的输出?您可能对“和”和“或”有混淆。您已经在使用或条件???我的问题是我想检查3个条件1。(SecurityName像“%rv%”,数量<0,PortfolioId=@PortfolioId)2。(SecurityName不像“%rv%”,数量>0,PortfolioId=@PortfolioId)3.(Value=Quantity AND Securities.PortfolioId=@PortfolioId)使用单独的where条件将问题分解为3个查询,然后合并查询可能更容易、更高效together@MarcinJuraszek如果条件在“where”子句或“join”子句中,则无所谓(性能差异),所以他的质疑是正确的。