如何在sql中同时使用或/和运算符?
我在使此查询正常工作时遇到问题,实际上我正在尝试同时使用OR和and运算符,但似乎无法找出出现此错误的原因:“如何在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
“预期为
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”逻辑与海报上写的不同。