我有一个输入文件,其中包含一些带有通配符的行,有些则没有。如果输入中有通配符(*),我想比较数据库元素的子字符串。如果没有通配符,我将比较输入字符串和完整数据库元素的确切值。
我目前的代码如下:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
代码有效,但我认为如果我可以将OR子句合并到一个CASE语句中,它可能会被简化。我无法使用CASE进行任何操作。有任何想法吗?
答案 0 :(得分:1)
您的两个子查询引用同一个表。您应该能够通过OR
将WHERE
子句合并到一个子查询中。我知道它没有具体回答您关于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
的特殊字符,意味着任何一个角色。