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

标签 mysql sql database substring

我正在尝试使用 mysql 从姓氏不以 z 或 Z 开头的表中检索姓名列表。我尝试将 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 作为姓氏的第一个字母的结果。谁能解释为什么?或者是否有更好的方法来实现这一点

最佳答案

使用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 使用列上的索引(如果存在)。

关于mysql - 省略以特定字符开头的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29625032/

相关文章:

sql - 在 SQL 中生成轮类模式

sql - 如何获取 SQL 登录用户的 Windows 登录用户名

mysql - mySQL 上的非常简单的查询(初学者问题)

database - 如何将 R 绘图图像保存到数据库?

mysql - 无需外键即可加入

python - Django 中的 Group by 创建错误的查询

php - 数据未进入表(mySQL)(没有出现错误)

php - 如何解决我的 Laravel 对同一列名的查询之间的问题

sql - 如何在 Redshift 中拆分字符串并迭代

php - 带有 INNER JOIN 的 MySQL SELECT 2 表