当前位置: 首页 > 知识库问答 >
问题:

赛贝斯BIT数据类型过滤

充培
2023-03-14

我们将Sybase ASE用于从头开发的应用程序。我们有一些表有位列。在Sybase中,位数据类型不能为null。对于我们存储在表中的记录来说,这很好,但是我们的搜索存储过程存在设计问题。我们的存储过程和相应的数据访问层类(在.NET中使用Dapper)严重依赖代码生成器。由于我们无法将位参数的NULL传递给搜索存储过程,因此我们只能检索位列中具有1或0值的记录。下面的例子:

Table1
Column1 INT NULL,
Column2 BIT

SPROC1
@Column1 INT NULL,
@Column2 BIT

SELECT
Column1,
Column2
FROM
Table1
WHERE
Column1 = ISNULL(@Column1, Column1) AND
Column2 = ISNULL(@Column2, Column2) --since @Column2 contains either 1 or 0, this search sproc cannot return both

这里有一些变通方法,比如引入另一个位参数来表示是否跳过匹配位列,但是由于我们编写并维护存储过程代码生成器,所以我们希望存储过程尽可能简单。更不用说对每个位列/参数都必须这样做。另一种方法当然是将位数据类型更改为tinyint。但这是一个有效的/好的设计吗?对我来说这似乎不是一个好的做法,但这应该可以解决Sybase的所有问题。我们可以创建一个custome tinyint数据类型,该数据类型可以为null,并且只允许0和1。如果我们改为tinyint,我们将别无选择,只能将数据访问类的布尔属性改为int16(我同意这一点,只是为了避开位问题)。

有什么建议吗?

共有1个答案

晁聪
2023-03-14

根据上面的生成器,传递null意味着不基于该列进行过滤。如果可以修改生成器代码,请检查以下解决方案:

在Sybase中,位数据类型接受除0和1以外的值,但总是被解释为1。

可以通过传递(-1)或传递(3)来调用存储的进程;当一个人的目标是不基于该列进行筛选时。生成器的代码可以被更新,以动态生成以下sql:

SELECT
Column1,
Column2
FROM
Table1
WHERE
Column1 = ISNULL(@Column1, Column1) AND
( Column2 = ISNULL(@Column2, Column2) or ( @column2 not in (1,0) ) )
Column3 = ISNULL(@Column3, Column3) AND 
.....
 类似资料:
  • Support for the Sybase database. The following table summarizes current support levels for database release versions. 数据库接口支持 The following dialect/DBAPI options are available. Please refer to individ

  • 我在将从Sql Server迁移到ASE(v16.0)中具有用户定义类型的的列时遇到问题。 我有简单的用户定义类型: 这在一个小表中使用: 我正在尝试使用。源值在SqlServer中定义为。我使用. net客户端进行ASE,我的应用程序代码是C#:

  • 我在临时表中填充了数据(该表最多将始终有 10 条记录)。我正在尝试的下一步是逐个拾取记录并查询数据库以测试某些条件并根据查询结果分配注释。例如: 我正在尝试编写一个sybase查询,它将一个接一个地拾取数据(递归地?),运行一些指定的查询并返回一个通过或失败的注释,然后我将最终填充到另一个临时表中 例如:第1行是AB1-从表中选择名称,其中name='AB1'如果它没有返回数据,我会停在那里并填

  • 你可能已经注意到,在讨论近邻算法时,我们使用的都是数值型的数据,而在学习朴素贝叶斯算法时,用的是分类型的数据。 比如,人们对法案的投票有赞成和否决两类;音乐家可以用他们演奏的乐器来分类等等。这些分类之间是没有距离的,萨克斯手和钢琴家的距离并不会比鼓手近。而数值型数据则有这种远近之分。 在贝叶斯方法中,我们会对事物进行计数,这种计数则是可以度量的。对于数值型的数据要如何计数呢?通常有两种做法: 方法

  • 我想生成从0到9000000的数字。在Oracle中,我可以使用下面的代码。如何在赛贝斯ASE中做到这一点? 这是在甲骨文中: 如何在Sybase ASE中实现这一点? 我不能创建一个表并添加一个标识,因为我需要从1到9000000的数字,所以一个表会很复杂。有查询可以做到这一点吗?

  • 我在赛贝斯ASE 15.5中使用赛贝斯Central工具创建了几个表。我已经将列定义为主键(int数据类型),不知何故,该列也变成了标识。 现在,从赛贝斯中心,我无法从该列中删除标识,即使该表或任何引用的表中没有数据。 有人能帮忙吗?我不想使用Set IDENTITY_INSERT,我想从本专栏中完全删除标识行为。 谢啦