简体   繁体   English

如何从这个丑陋的代码中重写“ where and and”语句

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM