我无法按照我想要的方式运行此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)
我希望只能在给定的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
这是包含所有数据的查询的屏幕截图
答案 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)
)
注意最后一个子句的括号。
原因如下:
你的第一个声明到处都有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语句中获得任何结果。
你的第二个陈述接近你想要的但不完全的。正如Luuan指出括号是必需的:A AND B和C或D与A AND B和(C OR D)不同。有关详细说明,请参阅http://en.wikipedia.org/wiki/Associative_property。
编辑:您在问题评论中提供的软件是问题的根源,因为它不会生成您需要的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 + ")";
}