sql – 如何将true / false / unknown映射到-1 / 0 / null而不重
发布时间:2020-12-12 06:43:10 所属栏目:MsSql教程 来源:网络整理
导读:我目前正在开发一个工具来帮助我的用户将他们的SQL代码移植到SQL-Server 2005.为此,我将SQL解析为语法树,分析它需要注意的构造,修改它并将其转换回T – SQL. 在我想要支持的事情上,其他RDBMS的“bools is values too”语义.例如,MS-Access允许我从A中选择A.x
我目前正在开发一个工具来帮助我的用户将他们的SQL代码移植到SQL-Server 2005.为此,我将SQL解析为语法树,分析它需要注意的构造,修改它并将其转换回T – SQL.
在我想要支持的事情上,其他RDBMS的“bools is values too”语义.例如,MS-Access允许我从A中选择A.x和A.y作为r,这在T-SQL中是不可能的,因为: >列不能具有布尔类型(列值不能和’) 因此,我的转换例程将上述语句转换为: select case when (A.x<>0) and (A.y<>0) then -1 when not((A.x<>0) and (A.y<>0)) then 0 else null end as r from A; 哪个有效,但很烦人,因为我必须复制逻辑表达式(可能非常复杂或包含子查询等)以区分true,false和unknown – 后者应映射为null.所以我想知道T-SQL专业人员是否知道更好的方法来实现这一目标? 更新: select A.x and exists (select * from B where B.y=A.y) from A; 解决方法我不认为有一个好的答案,实际上它是TSQL的限制.您可以为所需的每个布尔表达式创建UDF CREATE FUNCTION AndIntInt ( @x as int,@y as int ) RETURNS int AS BEGIN if (@x<>0) and (@y<>0) return -1 if not((@x<>0) and (@y<>0)) return 0 return null END 通过使用 select AndIntInt(A.x,A.y) as r from A (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |