[英]How to rewrite “where, and, or” statement from this ugly code
my code works but is awful. 我的代码可以用,但是很糟糕。 is there a way to clean this code in an proper way?
有没有办法以适当的方式清除此代码?
this code (stored proc) is used to do a search for a word in different columns in one table and posts that have different roll id (0-4) 此代码(存储的proc)用于在一个表中的不同列中搜索单词,以及具有不同卷名(0-4)的帖子
@searchval nvarchar(500),
@arrStatusTyp int,
@rolltypAdmin int,
@roll1 int,
@roll2 int,
@roll3 int,
@roll4 int,
@visningsperiod nvarchar(4)
SELECT kk_aj_tbl_Arrangemang.ArrID
FROM kk_aj_tbl_content INNER JOIN
kk_aj_tbl_arridtoContent ON kk_aj_tbl_content.Contentid = kk_aj_tbl_arridtoContent.contentid INNER JOIN
kk_aj_tbl_Arrangemang ON kk_aj_tbl_arridtoContent.arrid = kk_aj_tbl_Arrangemang.ArrID INNER JOIN
kk_aj_tbl_ArrangemangStatus ON kk_aj_tbl_Arrangemang.ArrangemangStatusID = kk_aj_tbl_ArrangemangStatus.ArrangemangStatusID INNER JOIN
kk_aj_tbl_Konstformtyp ON kk_aj_tbl_Arrangemang.KonstformID = kk_aj_tbl_Konstformtyp.KonstformID INNER JOIN
Users ON kk_aj_tbl_Arrangemang.AdminuserID = Users.UserID INNER JOIN
kk_aj_tbl_utovare ON kk_aj_tbl_Arrangemang.UtovarID = kk_aj_tbl_utovare.UtovarID
WHERE
(kk_aj_tbl_Arrangemang.ArrangemangStatusID = @arrStatusTyp) AND (kk_aj_tbl_arridtoContent.Version=1) AND
(
(kk_aj_tbl_content.Rubrik LIKE '%'+@searchval+'%') AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll1) OR
(kk_aj_tbl_content.Rubrik LIKE '%'+@searchval+'%') AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll2) OR
(kk_aj_tbl_content.Rubrik LIKE '%'+@searchval+'%') AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll3) OR
(kk_aj_tbl_content.Rubrik LIKE '%'+@searchval+'%') AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll4) OR
(kk_aj_tbl_content.Underrubrik LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll1) OR
(kk_aj_tbl_content.Underrubrik LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll2) OR
(kk_aj_tbl_content.Underrubrik LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll3) OR
(kk_aj_tbl_content.Underrubrik LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll4) OR
(kk_aj_tbl_utovare.Organisation LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll1) OR
(kk_aj_tbl_utovare.Organisation LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll2) OR
(kk_aj_tbl_utovare.Organisation LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll3) OR
(kk_aj_tbl_utovare.Organisation LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll4)
)
ORDER BY kk_aj_tbl_arridtoContent.datum DESC
thanks for all help 感谢所有帮助
Conditions like : 条件如下:
(cond1 OR cond2)
AND (cond1 OR cond3)
AND (cond1 OR cond4)
...
Can be rewritten as : 可以改写为:
cond1 AND (cond2 OR cond3 OR cond4)
Hence try the following WHERE
clause : 因此,请尝试以下
WHERE
子句:
...
WHERE
kk_aj_tbl_Arrangemang.ArrangemangStatusID = @arrStatusTyp
AND kk_aj_tbl_arridtoContent.Version=1
AND kk_aj_tbl_Konstformtyp.KonstformID IN (@roll1, @roll2, @roll3, @roll4)
AND (
kk_aj_tbl_content.Rubrik LIKE '%'+@searchval+'%'
OR kk_aj_tbl_content.Underrubrik LIKE '%'+@searchval+'%'
OR kk_aj_tbl_content.Organisation LIKE '%'+@searchval+'%'
)
First use a custom table alias so you don't have to repeat the full table name (use a significant one, not A, B, C like my example). 首先使用自定义表格别名,这样您就不必重复完整的表格名称(使用有效的名称,而不是像我的示例那样使用A,B,C)。 You can rewrite your multiple
OR
as IN
: 您可以将多个
OR
重写为IN
:
WHERE
A.ArrangemangStatusID = @arrStatusTyp AND
D.Version = 1 AND
(
(B.Rubrik LIKE '%' + @searchval + '%' AND E.KonstformID IN (@roll1, @roll2, @roll3, @roll4)) OR
(B.Underrubrik LIKE '%' + @searchval + '%' AND E.KonstformID IN (@roll1, @roll2, @roll3, @roll4)) OR
(C.Organisation LIKE '%' + @searchval + '%' AND E.KonstformID IN (@roll1, @roll2, @roll3, @roll4))
)
You don't need to enclose all conditions in parenthesis, only use them when necessary. 您不需要将所有条件都括在括号中,仅在必要时使用它们。
SELECT kk_aj_tbl_arrangemang.arrid
FROM kk_aj_tbl_content
INNER JOIN kk_aj_tbl_arridtocontent
ON kk_aj_tbl_content.contentid = kk_aj_tbl_arridtocontent.contentid
INNER JOIN kk_aj_tbl_arrangemang
ON kk_aj_tbl_arridtocontent.arrid = kk_aj_tbl_arrangemang.arrid
INNER JOIN kk_aj_tbl_arrangemangstatus
ON kk_aj_tbl_arrangemang.arrangemangstatusid = kk_aj_tbl_arrangemangstatus.arrangemangstatusid
INNER JOIN kk_aj_tbl_konstformtyp
ON kk_aj_tbl_arrangemang.konstformid = kk_aj_tbl_konstformtyp.konstformid
INNER JOIN users
ON kk_aj_tbl_arrangemang.adminuserid = users.userid
INNER JOIN kk_aj_tbl_utovare
ON kk_aj_tbl_arrangemang.utovarid = kk_aj_tbl_utovare.utovarid
WHERE ( kk_aj_tbl_arrangemang.arrangemangstatusid = @arrStatusTyp )
AND ( kk_aj_tbl_arridtocontent.version = 1 )
AND ( ( kk_aj_tbl_content.rubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll1 )
OR ( kk_aj_tbl_content.rubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll2 )
OR ( kk_aj_tbl_content.rubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll3 )
OR ( kk_aj_tbl_content.rubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll4 )
OR ( kk_aj_tbl_content.underrubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll1 )
OR ( kk_aj_tbl_content.underrubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll2 )
OR ( kk_aj_tbl_content.underrubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll3 )
OR ( kk_aj_tbl_content.underrubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll4 )
OR ( kk_aj_tbl_utovare.organisation LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll1 )
OR ( kk_aj_tbl_utovare.organisation LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll2 )
OR ( kk_aj_tbl_utovare.organisation LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll3 )
OR ( kk_aj_tbl_utovare.organisation LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll4 ) )
ORDER BY kk_aj_tbl_arridtocontent.datum DESC
Using table alias and simplifying WHERE clause: 使用表别名并简化WHERE子句:
SELECT am.ArrID
FROM kk_aj_tbl_content c
INNER JOIN kk_aj_tbl_arridtoContent a2c ON c.Contentid = a2c.contentid
INNER JOIN kk_aj_tbl_Arrangemang am ON a2c.arrid = am.ArrID
INNER JOIN kk_aj_tbl_ArrangemangStatus ams ON am.ArrangemangStatusID = ams.ArrangemangStatusID
INNER JOIN kk_aj_tbl_Konstformtyp kft ON am.KonstformID = kft.KonstformID
INNER JOIN Users u ON am.AdminuserID = u.UserID
INNER JOIN kk_aj_tbl_utovare uto ON am.UtovarID = uto.UtovarID
WHERE am.ArrangemangStatusID = @arrStatusTyp
AND a2c.Version = 1
AND kft.KonstformID in (@roll1,@roll2,@roll3,@roll4)
AND (
c.Rubrik LIKE '%'+@searchval+'%' OR
c.Underrubrik LIKE '%'+@searchval+'%' OR
uto.Organisation LIKE '%'+@searchval+'%'
)
ORDER BY a2c.datum DESC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.