使用CASE语句可以简化使用两个EXISTS子句的代码吗?

时间:2015-08-05 15:51:00

标签: mysql case exists

我有一个输入文件,其中包含一些带有通配符的行,有些则没有。如果输入中有通配符(*),我想比较数据库元素的子字符串。如果没有通配符,我将比较输入字符串和完整数据库元素的确切值。

我目前的代码如下:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

代码有效,但我认为如果我可以将OR子句合并到一个CASE语句中,它可能会被简化。我无法使用CASE进行任何操作。有任何想法吗?

3 个答案:

答案 0 :(得分:1)

您的两个子查询引用同一个表。您应该能够通过ORWHERE子句合并到一个子查询中。我知道它没有具体回答您关于CASE的问题,但它应该会简化您的查询。

答案 1 :(得分:0)

只需将WHERE子句从第二个EXIST移到第一个:

SELECT *
  FROM path.dbfile dbf
WHERE (
       EXISTS                                                
      (SELECT 1                                              
         FROM path.infile slt                          
        WHERE 
             (slt.ndc = dbf.ndc                           
                and LOCATE('*', slt.ndc) = 0) OR 
             (substr(dbf.ndc,1,locate('*', slt.ndc)-1) =  
                substr(slt.ndc,1,locate('*', slt.ndc)-1)       
               and LOCATE('*', slt.ndc) <> 0))
      )

答案 2 :(得分:0)

如果我错了,请纠正我,但我相信你的逻辑是:

SELECT DISTINCT dbf.*
  FROM path.dbfile dbf
  JOIN path.infile slt
 WHERE LOCATE(SUBSTRING_INDEX(slt.ndc,'*',1), dbf.ndc) = 1;

如果分隔符不存在,函数SUBSTRING_INDEX将返回整个字符串。

另一种选择是:

SELECT DISTINCT dbf.*
  FROM path.dbfile dbf
  JOIN path.infile slt
 WHERE dbf.ndc LIKE REPLACE(REPLACE(slt.ndc, '_', '\\_'), '*', '%');

允许您在*运算符中使用% LIKE,假设您的文件名中没有任何百分号。 我已经逃脱了任何下划线,因为这些也是LIKE的特殊字符,意味着任何一个角色。