【问题标题】:MySQL Compare VARCHAR ColumnsMySQL 比较 VARCHAR 列
【发布时间】:2012-04-30 09:04:09
【问题描述】:

我有一个名为D1_VAL的列

此列中的行具有如下所示的数据:

C:10
R:200
E:3
N:77

我正在尝试使用逻辑运算符对这些值进行搜索。我试过这个:

SELECT * FROM d1 WHERE CAST(`D1_VAL` AS UNSIGNED) > 5

它不返回任何行。我也试过:

SELECT * FROM d1 WHERE (0 + `D1_VAL`) > 5

我该如何正确地做到这一点?

【问题讨论】:

  • 每个字符串的开头总是一个字符加冒号还是可以变化?
  • @zerkms 总是一个字符 + 冒号
  • 如果将其分成两列,然后将第二列视为适当的整数类型列,您将获得更有效的搜索。

标签: mysql casting varchar


【解决方案1】:

这个查询就可以了,

SELECT * FROM d1 WHERE CAST(SUBSTRING(`D1_VAL`, 3) AS UNSIGNED) > 5

但最好将C:10 等值标准化为两个单独的列。

create table d1(
    letter char(1),
    number int,
    // ... other columns
)

【讨论】:

    【解决方案2】:

    你想要做的比较是什么?

    如果将数字(在冒号右侧)与 5 进行比较,请尝试以下操作:

    CAST(SUBSTRING(`D1_VAL`, INSTR(`D1_VAL`, `:`)) AS UNSIGNED) > 5 
    

    有关字符串函数的更多信息,请参阅here

    另外,我建议考虑一下数据库设计 - 即,将此列的内容存储在两列中会更好 - 例如一个字符和一个整数?这将更有效 - 需要更少的磁盘空间并允许更快的查询。如果您有很多行,执行各种字符串函数、强制转换等可能会使您的查询运行缓慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      相关资源
      最近更新 更多