AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 284484
Accepted
Freedo
Freedo
Asked: 2021-02-02 16:22:36 +0800 CST2021-02-02 16:22:36 +0800 CST 2021-02-02 16:22:36 +0800 CST

SELECT with where between 未按预期工作

  • 772

我正在尝试使用此查询在名称 C89 到 C110 之间进行过滤。

SELECT id FROM servers WHERE server_name BETWEEN 'C89' AND 'C110'

但这不起作用。如果我将 c89 更改为 c90,它至少会选择两台服务器。就像它只使用计算中的前 2 个数字一样。

谁能帮我 ?我正在使用 mariadb 10.5 我正在寻找一种不需要在查询中添加大量单词的解决方案。为了可读性尽可能精简

select mariadb
  • 2 2 个回答
  • 63 Views

2 个回答

  • Voted
  1. Best Answer
    Rick James
    2021-02-02T21:05:53+08:002021-02-02T21:05:53+08:00

    一个简短的答案:

    ... WHERE MID(server, 2) BETWEEN 89 AND 110
    

    或者,如果您需要限制为“C”组服务器:

    ... WHERE MID(server, 2) BETWEEN 89 AND 110
          AND server LIKE "C%"
    

    或者(为了避免“24H1”的麻烦),

    ... WHERE IF(server LIKE "C%", 
                 MID(server, 2) BETWEEN 89 AND 110,
                 FALSE)
    

    哦,现在我看到另一个“坏”的服务器名称(INT1)。面对现实,您需要将一些负担放在 DBA 身上。他必须意识到,实际的方法是说

    ... WHERE server BETWEEN 'C89'  AND 'C99'
           OR server BETWEEN 'C100' AND 'C110'
    

    也就是说,根据需要将过滤分解为尽可能多的范围,以便字符串比较可以工作,而不是认为是数字的。

    • 3
  2. J.D.
    2021-02-02T17:32:23+08:002021-02-02T17:32:23+08:00

    正如评论中提到的,在比较字符串时,它们是按字典顺序而不是按数字进行比较的(即使它们包含数值)。这意味着每个字符都与相同索引的比较字符串的字符进行比较。例如,比较字符串“10”和“3”将导致“10”在“3”之前,因为“1”在“3”之前。我不确定这是否适用于 MariaDB,但在其他 RDBMS 中,当不确定一个字符与另一个字符的顺序时,您通常可以引用ASCII 表(注意大写字母在小写字母之前)。

    如果所有服务器都server_name以字母“C”开头,那么您可以使用REPLACE()MariaDB 中的函数去掉“C”,然后将字符串转换为 INT,如下所示:

    SELECT id 
    FROM servers 
    WHERE REPLACE(server_name, 'C', '')
        BETWEEN 89 AND 110
    
    • 1

相关问题

  • 如何在选择(SQL Server)中使用变量?

  • 复杂的mysql选择

  • "对于每组满足条件X的结果,只选择列值A最小的结果"

  • 如何从 SHOW TABLE STATUS 结果中选择

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve