如何使用多个"喜欢"和"和"

时间:2014-09-22 07:34:21

标签: sql sql-server

我无法按照我想要的方式运行此SQL查询。我正在尝试使用"匹配"匹配记录#34;和"和"但我没有得到任何结果。当我把它改成"或"我得到了结果。

为什么我使用时没有得到任何结果?

SELECT   a.MOD_REQ_NUM,
         a.REFERENCE_CODE,
         a.REFERENCE_VALUE,
         a.ACTIVE_DETAIL,
         b.REQUESTOR_WWID,
         b.REQUEST_DATE
 from DB_MOD_REQ_DETAILS a, DB_MOD_REQ_HEADER b
 where a.MOD_REQ_NUM=b.MOD_REQ_NUM
 and a.ACTIVE_DETAIL='Y' 
 and b.ACTIVE_HEADER='Y'
 ----------------------------------------------------------
 and 
    (a.REFERENCE_VALUE like '%43598%' and a.REFERENCE_CODE = 2)
 and 
    (a.REFERENCE_VALUE like '%3694894%' and a.REFERENCE_CODE = 4)

这是我使用"或"

时的屏幕截图

enter image description here



更新

我希望只能在给定的a.REFERENCE_CODE中搜索a.REFERENCE_VALUE。我有表单字段和C#foreach循环。每个字段都有自己的REFERENCE_CODE。如果用户正在搜索1个字段,我想这样做:

(a.REFERENCE_VALUE like '%43598%' and a.REFERENCE_CODE = 2)

如果用户正在搜索多个字段,我想匹配:

a.REFERENCE_VALUE like '%43598%' and a.REFERENCE_CODE = 2
and
a.REFERENCE_VALUE like '%3694894%' and a.REFERENCE_CODE = 4

这是包含所有数据的查询的屏幕截图 enter image description here

3 个答案:

答案 0 :(得分:5)

这部分没有意义:

and 
    (a.REFERENCE_VALUE like '%43598%' and a.REFERENCE_CODE = 2)
and 
    (a.REFERENCE_VALUE like '%3694894%' and a.REFERENCE_CODE = 4)

REFERENCE_CODE怎么能成为2和4?至少,最后两组条件之间应该存在OR,即

and 
    ((a.REFERENCE_VALUE like '%43598%' and a.REFERENCE_CODE = 2)
or
    (a.REFERENCE_VALUE like '%3694894%' and a.REFERENCE_CODE = 4))

您可能也可能不需要将其他AND运算符更改为OR。

答案 1 :(得分:1)

(a.REFERENCE_VALUE like '%43598%' and a.REFERENCE_CODE = 2) and (a.REFERENCE_VALUE like '%3694894%' and a.REFERENCE_CODE = 4)

这意味着两个条件应该同时为真,在这种情况下(根据您的结果)并非如此。当您将其更改为:

(a.REFERENCE_VALUE like '%43598%' and a.REFERENCE_CODE = 2) or(a.REFERENCE_VALUE like '%3694894%' and a.REFERENCE_CODE = 4)

这意味着如果任何这些条件成立,则整个陈述被认为是真实的,然后您可以在结果中看到它们。 问题是你真的想做什么?

答案 2 :(得分:1)

从您的问题和您对jmcilhinney的回答中,您想要的SQL语句是:

SELECT   a.MOD_REQ_NUM,
         a.REFERENCE_CODE,
         a.REFERENCE_VALUE,
         a.ACTIVE_DETAIL,
         b.REQUESTOR_WWID,
         b.REQUEST_DATE
FROM DB_MOD_REQ_DETAILS a, DB_MOD_REQ_HEADER b
WHERE a.MOD_REQ_NUM=b.MOD_REQ_NUM
  AND a.ACTIVE_DETAIL='Y' 
  AND b.ACTIVE_HEADER='Y'
----------------------------------------------------------
  AND 
  (
      (a.REFERENCE_VALUE like '%43598%' and a.REFERENCE_CODE = 2)
      OR
      (a.REFERENCE_VALUE like '%3694894%' and a.REFERENCE_CODE = 4)
  )

注意最后一个子句的括号。

原因如下:

  1. 你的第一个声明到处都有AND运算符。这导致其他子句(a.MOD_REQ_NUM=b.MOD_REQ_NUM AND a.ACTIVE_DETAIL='Y' AND b.ACTIVE_HEADER='Y' AND a.REFERENCE_VALUE like '%43598%' AND a.REFERENCE_VALUE like '%3694894%')以及这些子句的结合: a.REFERENCE_CODE = 4 AND a.REFERENCE_CODE = 2总是假的。因此,您将不会从此SQL语句中获得任何结果。

  2. 你的第二个陈述接近你想要的但不完全的。正如Luuan指出括号是必需的:A AND B和C或D与A AND B和(C OR D)不同。有关详细说明,请参阅http://en.wikipedia.org/wiki/Associative_property


  3. 编辑:您在问题评论中提供的软件是问题的根源,因为它不会生成您需要的SQL语句(以及jmcilhinney和Beatles1692都尝试过的语句)提供)。

    首先替换GetParamDataSet中的以下行

    strCond = " a.REFERENCE_VALUE LIKE'%" + item.Substring(item.IndexOf('=') + 1).Trim() + "%'" +
                                    " and a.REFERENCE_CODE= " + id;
    

    strCond = " (a.REFERENCE_VALUE LIKE'%" + item.Substring(item.IndexOf('=') + 1).Trim() + "%'" +
                                    " and a.REFERENCE_CODE= " + id + ")";
    

    注意括号!

    第二次GetDataValue(List<string> conditions)中的主要块替换为

    string strSQL = "SELECT a.MOD_REQ_NUM, " +
                    " a.REFERENCE_CODE, " +
                    " a.REFERENCE_VALUE, " +
                    " a.ACTIVE_DETAIL, " +
                    " b.REQUESTOR_WWID, " +
                    " b.REQUEST_DATE " +
                    " from DB_MOD_REQ_DETAILS a, DB_MOD_REQ_HEADER b " +
                    " where a.MOD_REQ_NUM=b.MOD_REQ_NUM " +
                    " and a.ACTIVE_DETAIL='Y' and b.ACTIVE_HEADER='Y' ";
    
    -- construct the conjunction of "(a.REFERENCE_VALUE LIKE '%%' and a.REFERENCE_CODE = %)"
    string referenceCodeValueCondition = string.Join<string>( " OR ", conditions );
    
    -- append the conjunction block to the other conditions
    if (! string.IsNullOrEmpty( referenceCodeValueCondition ))
    {
        strSQL = strSQL + " AND (" + referenceCodeValueCondition + ")";
    }