如果where子句值超过列长度,则是一个可移植的查询?

时间:2013-03-22 20:06:52

标签: sql

如果我有acct_id CHAR(3)

之类的查询
select * from some_table where acct_id like '12%3%';

大多数关系数据库会接受此查询,还是会因为我比较的值长于列而失败?

换句话说:如果我的where子句超出了列的限制,那么这个查询是否可以跨典型数据库(如MySql,DB2和Oracle)移植?

此外,对于=比较而不是LIKE是否同样如此?

我尝试了对DB2(x86和大型机)的查询,但它没有导致任何错误,但我不确定其他数据库。在提交之前,我查看了几个SO问题的标题。

2 个答案:

答案 0 :(得分:3)

您的CHAR(3)列中唯一可以匹配的值是'123',但%运算符支持0次或更多次重复。没有理由拒绝测试。

事实上,您甚至可以比较WHERE acct_id = '1234',而复杂的优化器可能会意识到没有任何值等于该值并将该术语视为假。没有明显的理由说明为什么这应该被拒绝为“无效的SQL”;这只是一个戏剧性优化的机会。

答案 1 :(得分:0)

感谢@MarcinJuraszek在我现在所知道的关于SQL Fiddle的评论中,并且它在我尝试过的每个数据库中都有效:

  • MySQL 5.5.30
  • Oracle 11g R2
  • PostgreSQL 9.2.1
  • SQLite的
  • MS SQL Server 2012
  • MS SQL Server 2008

另外,我在DB2 Express-C 9.7.5和z / OS(大型机)9.1上的DB2上尝试过它,它在两者中都有效。