【问题标题】:sql join on string = integer to work on any RDBMSsql join on string = integer 在任何 RDBMS 上工作
【发布时间】:2015-02-23 00:55:44
【问题描述】:

我需要join 列上的两个表,在一个表中定义为 string,在另一个表中定义为 integer。在这两列中存储的实际数据都是整数。这是设计给我的 - 我无法更改。

所以当我加入MySQL 时,它会默默地进行转换。 PostgreSQL 抱怨。有CAST 运算符,我可以将它们添加到查询中以将字符串 转换为整数,但CAST 函数在不同的RDBMS 中定义不同。

我可以按照在所有(或许多)RDBMS 中工作的方式编写此查询吗?或者,是否有数据库抽象层可以为我做到这一点? ADODB 已经在项目中使用,但我看不出它是否以及如何有助于解决这个问题。

谢谢。

【问题讨论】:

  • CAST(expr AS type) 是 ANSI SQL,应该适用于所有 RDBMS
  • 这是它在 MySQL 中的定义:CAST(VAR AS UNSIGNED),这里是 PostgreSQL:CAST(VAR AS INTEGER)
  • 为什么不使用INTEGER 输入mysql呢?
  • 好吧,我刚刚在 MySQL 5.5.x 中运行它以确保“整数”出现错误。 'unsigned' 有效,但它并不好......
  • 看来你是对的。哦,天哪,似乎 mysql 的开发有尽可能多的不兼容性:-S

标签: mysql sql postgresql join adodb


【解决方案1】:

由于数据类型的原因,您不能对每个数据库以相同的方式将CAST 转换为INT,因此您可以将数字字段转换为CHAR

CAST(a.numeric_Field AS CHAR(5))` = b.stringfield

这将适用于 Postgresql、MySQL、SQL Server,不确定其他。

【讨论】:

  • 我会试一试并报告。这并不理想,因为:a)加入“字符串”列/值比整数慢 b)实际数据是整数,所以这是相当“错误”的做事方式。
  • 这确实有效。查询的性能差了 2 倍,我还没有发现重写它以更快运行的可能性,但这 - 至少 - 有效。谢谢!
【解决方案2】:

您也可以将 string 值转换为 int。

SELECT tb1.* FROM tb1
  INNER JOIN tb2         
  ON tb1.id = tb2.stringfield::int;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 2021-02-21
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多