gpt4 book ai didi

sql - 如何将 true/false/unknown 映射到 -1/0/null 而不重复?

转载 作者:行者123 更新时间:2023-12-02 13:51:33 25 4
gpt4 key购买 nike

我目前正在开发一个工具来帮助我的用户将他们的 SQL 代码移植到 SQL-Server 2005。为此,我将 SQL 解析为语法树,分析它以查找需要注意的结构,对其进行修改和转换返回到 T-SQL。

我想要支持的是其他 RDBMS 的“ bool 也是值”语义。例如,MS-Access 允许我编写 select A.x and A.y as r from A,这在 T-SQL 中是不可能的,因为:

  1. 列不能具有 bool 类型(列值不能进行 and'ed)
  2. 逻辑谓词不能用在需要表达式的地方。

因此,我的转换例程将上述语句转换为:

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;

这有效,但很烦人,因为我必须复制逻辑表达式(可能非常复杂或包含子查询等)才能区分 truefalseunknown - 后者应映射为 null。所以我想知道这里的 T-SQL 专家是否知道实现此目的的更好方法?

更新:我想指出的是,尝试将操作数保留在整数域中的解决方案必须考虑到某些操作数可能是第一位的逻辑表达式。这意味着仍然需要一种将 bool 转换为值的有效解决方案。例如:

select A.x and exists (select * from B where B.y=A.y) from A;

最佳答案

我认为没有一个好的答案,这实际上是 TSQL 的限制。

您可以为您需要的每个 bool 表达式创建一个 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

关于sql - 如何将 true/false/unknown 映射到 -1/0/null 而不重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4768915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com