Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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中同时使用或/和运算符?_Sql_Tsql - Fatal编程技术网

如何在sql中同时使用或/和运算符?

如何在sql中同时使用或/和运算符?,sql,tsql,Sql,Tsql,我在使此查询正常工作时遇到问题,实际上我正在尝试同时使用OR和and运算符,但似乎无法找出出现此错误的原因:““预期为ABSOLUTE'或ACTION'或ADD'或ALL'或ALTER'”。以下是我的sql代码: SELECT * FROM EDXW ED, TRANSACTION TXN WHERE ED.LAM_BK like 'TAR%' AND ED.KEY = TXN.KEY AND substring(ED.JAM_BK from position('~' in ED.JAM_BK

我在使此查询正常工作时遇到问题,实际上我正在尝试同时使用OR和and运算符,但似乎无法找出出现此错误的原因:“
“预期为
ABSOLUTE'或
ACTION'或
ADD'或
ALL'或
ALTER'”。以下是我的sql代码:

SELECT * 
FROM EDXW ED, TRANSACTION TXN
WHERE ED.LAM_BK like 'TAR%'
AND ED.KEY = TXN.KEY
AND substring(ED.JAM_BK from position('~' in ED.JAM_BK) + 1) = TXN.EBS_ID

(AND ED.CLS_CD IN ('WIS','OP','OPP')
AND TXN.REV_CD IN ('0360','0361')
AND TXN.LS_CTR_CD IN ('548000','552000','552500','553000','553500','554000','555000','555500','558000')
AND ED.SITE_CD = 'X' )

OR

( ED.ED_CLS_CD IN ('WIS','OP','OPP')
AND AND TXN.REV_CD IN ('0350','0311')
AND AND TXN.LS_CTR_CD IN ('548000','558300')
AND LOC.ED_SITE_CD = 'M')

OR

( ED.ED_CLS_CD IN ('WIS','OP','OPP')
AND AND TXN.REV_CD IN ('0350','0311')
AND AND TXN.LS_CTR_CD IN ('549000','557300')
AND LOC.ED_SITE_CD IN ('M','K'));

您有额外的参数或缺少和/或。以下是一个简化版本,显示了问题:

SELECT * 
FROM tables
WHERE clause1
(AND clause2)
从SQL的角度来看,这是不正确的。可能的正确版本是

SELECT * 
FROM tables
WHERE clause1
AND (clause2)

SELECT * 
FROM tables
WHERE clause1
OR (clause2)
看到区别了吗?parens group语句。因此可以使用更复杂的表达式,如: 选择* 从桌子上 第1条在哪里 和(第2条或第3条)


关键在于,如果要将参数中的所有内容减少为单个真/假值,则查询仍有意义。

您有额外的参数或缺少的和/或。以下是一个简化版本,说明了问题:

SELECT * 
FROM tables
WHERE clause1
(AND clause2)
从SQL的角度来看,这是不正确的。可能的正确版本是

SELECT * 
FROM tables
WHERE clause1
AND (clause2)

SELECT * 
FROM tables
WHERE clause1
OR (clause2)
看到区别了吗?parens group语句。因此可以使用更复杂的表达式,如: 选择* 从桌子上 第1条在哪里 和(第2条或第3条)


他们的关键是,如果你想把paren中的所有内容都简化为一个真/假值,那么查询仍然是有意义的。

我认为问题在于你说:
a和b和c,d或e或f
,但我认为你想说
a和b,c和(d或e或f)
这是非常不同的。当f为真或e为真时,整个表达式变为真。大括号清楚地表明了这一点。我认为您的选择必须如下所示:

SELECT * 
FROM EDXW ED, TRANSACTION TXN
WHERE ED.LAM_BK like 'TAR%'
AND ED.KEY = TXN.KEY
AND substring(ED.JAM_BK from position('~' in ED.JAM_BK) + 1) = TXN.EBS_ID
AND
(
 (ED.CLS_CD IN ('WIS','OP','OPP')
 AND TXN.REV_CD IN ('0360','0361')
 AND TXN.LS_CTR_CD IN ('548000','552000','552500','553000','553500','554000','555000','555500','558000') 
 AND ED.SITE_CD = 'X' )

OR

 ( ED.ED_CLS_CD IN ('WIS','OP','OPP')
 AND TXN.REV_CD IN ('0350','0311')
 AND TXN.LS_CTR_CD IN ('548000','558300')
 AND LOC.ED_SITE_CD = 'M')

OR

 ( ED.ED_CLS_CD IN ('WIS','OP','OPP')
 AND TXN.REV_CD IN ('0350','0311')
 AND TXN.LS_CTR_CD IN ('549000','557300')
 AND LOC.ED_SITE_CD IN ('M','K'))
);

我认为问题是你说:
a和b,c和d或e或f
,但我认为你想说
a和b,c和(d或e或f)
,这是非常不同的。当f为真或e为真时,整个表达式变为真。大括号清楚地表明了这一点。我认为你的选择必须如下:

SELECT * 
FROM EDXW ED, TRANSACTION TXN
WHERE ED.LAM_BK like 'TAR%'
AND ED.KEY = TXN.KEY
AND substring(ED.JAM_BK from position('~' in ED.JAM_BK) + 1) = TXN.EBS_ID
AND
(
 (ED.CLS_CD IN ('WIS','OP','OPP')
 AND TXN.REV_CD IN ('0360','0361')
 AND TXN.LS_CTR_CD IN ('548000','552000','552500','553000','553500','554000','555000','555500','558000') 
 AND ED.SITE_CD = 'X' )

OR

 ( ED.ED_CLS_CD IN ('WIS','OP','OPP')
 AND TXN.REV_CD IN ('0350','0311')
 AND TXN.LS_CTR_CD IN ('548000','558300')
 AND LOC.ED_SITE_CD = 'M')

OR

 ( ED.ED_CLS_CD IN ('WIS','OP','OPP')
 AND TXN.REV_CD IN ('0350','0311')
 AND TXN.LS_CTR_CD IN ('549000','557300')
 AND LOC.ED_SITE_CD IN ('M','K'))
);

你在查询的几个地方有
。你在查询的几个地方有
。不。问题是原来的海报写的是a和b(和c),而不是a和b和(c)。(你的编辑地址是这个)实际上是适用的。编辑后你的代码是正确的,但你的解释仍然不正确。你的“a和b”“这句话的逻辑和海报上写的不一样。问题是原来的海报写的是a和b(和c),而不是a和b(和c)。(您的编辑地址)实际上,它确实适用。您的代码在编辑后是正确的,但您的解释仍然不正确。你在句子中的“a和b”逻辑与海报上写的不同。