18

我正在尝试使应用程序能够在 Sql Server 和 PostgreSQL 上运行。

我似乎找不到一个基本的通用表达方式

 select * from table where booleancol=false

在 SQL Server 上我必须这样做(这非常令人困惑,因为位类型的默认值必须是 true 或 false,但您不能将它们分配给 true 或 false 或对其进行测试)

select * from table where booleancol=0

在 PostgreSQL 上我必须做

select * from table where booleancol is false

我们的程序中有相当多的查询可以做到这一点,所以我宁愿只使用一些通用语法而不是做if(dbformat=="postgres")..类型废话。

另外,我更愿意将列保留为布尔/位类型,而不是将它们更改为整数类型..尽管这是一个选项..

4

5 回答 5

33

对不起,这部分根本不是真的;不到一半是真的;-)

在 PostgreSQL 上我必须做

select * from table where booleancol is false

事实上,以下所有语法在 PostgreSQL 中都是有效的:

select * from table where not booleancol
select * from table where booleancol = 'f'
select * from table where booleancol = 'false'
select * from table where booleancol = 'n'
select * from table where booleancol is false
select * from table where booleancol is not true
select * from table where booleancol = false
select * from table where booleancol <> true
select * from table where booleancol != true
select * from table where booleancol <> 'TRUE'

这是 postgres 灵活语法的示例,它使从其他数据库移植应用程序变得非常容易。

请参阅文档

于 2010-01-06T09:52:59.457 回答
18

SQL Server 会自动将 bit 值更改为 true 或 false 的 varchar 值。所以以下工作在那里:

select * from table where booleancol = 'false'

我不知道 postgre 是否做同样的事情。

于 2009-12-22T20:21:14.617 回答
1

在工作中,我们在 char(1) 列中使用 'T' 和 'F' 来表示 SQL Server 中的布尔值。我不确定这种兼容性是否是原因,但这确实意味着“booleancol = 'F'”可以在任何一种数据库上工作。

于 2009-12-22T20:39:09.877 回答
0

如果可以,请查看对象关系映射框架,它可以处理将 SQL 从一个 RDBMS 转换为另一个的问题。

于 2009-12-22T20:20:21.800 回答
-9

使用 ORM,今天无需手动编写 SQL 代码。它们存在,因此可以解决您遇到的问题。

于 2009-12-22T20:19:25.423 回答