省略以特定字符开头的结果

时间:2015-04-14 10:29:45

标签: mysql sql database substring

我正在尝试从一个表中检索名称列表,其中姓氏不是以z或Z开头的,而是使用mysql。我尝试将substring与instr结合起来实现这一目标。尝试下面:

    SELECT DISTINCT SQL_CALC_FOUND_ROWS CONCAT(FName," ",SName)
    FROM Names  
    WHERE SUBSTRING(
                    CONCAT(FName, ' ' ,SName),
                    INSTR(CONCAT(FName, ' ' ,SName), ' ') +1,
                    1) 
          <> 'z' 
    OR SUBSTRING(
                  CONCAT(FName, ' ' ,SName), 
                  INSTR(CONCAT(FName, ' ' ,SName), ' ') +1, 
                  1)
          <> 'Z' 
    ORDER BY SName

我的尝试是以z作为姓氏的第一个字母返回结果。有谁能解释为什么?或者,如果有更好的方法来实现这个

2 个答案:

答案 0 :(得分:2)

使用LIKE

可以大大缩短这一点
SELECT DISTINCT SQL_CALC_FOUND_ROWS CONCAT(FName," ",SName)
FROM Names  
WHERE FName NOT LIKE 'z%' AND FName NOT LIKE 'Z%';

IIRC LIKE自MySQL v5.6.x以来区分大小写

我不会像

那样写
...WHERE LOWER(FName) NOT LIKE 'z%';

因为在列上应用函数会阻止MySQL使用列上的索引(如果存在)。

答案 1 :(得分:1)

SELECT DISTINCT SQL_CALC_FOUND_ROWS CONCAT(FName," ",SName)
FROM Names
WHERE FName REGEXP '^[^z]';