Sql 如果值为0且没有CASE语句,则返回1

Sql 如果值为0且没有CASE语句,则返回1,sql,sql-server,Sql,Sql Server,我试图找到一种更整洁的方法来执行下面的查询,这样我就不会重复我的代码 SELECT CASE WHEN <COMPLICATED CODE THAT RETURNS A SINGLE INT> = 0 THEN 1 ELSE <COMPLICATED CODE THAT RETURNS A SINGLE INT> END 您可以使用应用程序: 您还可以执行一系列功能: select coalesce(nullif(<COMPLICATED CODE THAT RE

我试图找到一种更整洁的方法来执行下面的查询,这样我就不会重复我的代码

SELECT CASE WHEN <COMPLICATED CODE THAT RETURNS A SINGLE INT> = 0
THEN 1
ELSE <COMPLICATED CODE THAT RETURNS A SINGLE INT> END
您可以使用应用程序:

您还可以执行一系列功能:

select coalesce(nullif(<COMPLICATED CODE THAT RETURNS A SINGLE INT>, 0), 1)
然而,我认为apply更清晰。此外,上述操作会将空值转换为1和0。

您可以使用apply:

您还可以执行一系列功能:

select coalesce(nullif(<COMPLICATED CODE THAT RETURNS A SINGLE INT>, 0), 1)
然而,我认为apply更清晰。此外,上述操作会将空值转换为1和0。

您可以使用IIF:

选择IIF1=1,“真”、“假”

您可以使用IIF:

选择IIF1=1,“真”、“假”


您可以将CTE或子查询用作

WITH CTE AS
(
  SELECT <COMPLICATED CODE THAT RETURNS A SINGLE INT> AS Value
  FROM ...
)
SELECT CASE WHEN Value = 0 THEN 1 ELSE Value END
FROM CTE

这样,您只需编写一次复杂的代码,然后只使用Value列。

您可以将CTE或子查询用作

WITH CTE AS
(
  SELECT <COMPLICATED CODE THAT RETURNS A SINGLE INT> AS Value
  FROM ...
)
SELECT CASE WHEN Value = 0 THEN 1 ELSE Value END
FROM CTE

这样,您只需编写一次复杂的代码,然后只使用值列。

使用子查询,然后您就可以计算出一个数学公式,用于给出所需的值,这样您就可以消除实际的布尔逻辑,并用数学函数替换 例如

SELECT *,(1 - ceiling(cos(atan(abs(cast(x as float)))) - 
           floor(cos(atan(abs(cast(x as float))))))) + 
           x * ceiling(cos(atan(abs(cast(x as float)))) - 
           floor(cos(atan(abs(cast(x as float)))))) as Computed
FROM
( select 0 as x union SELECT 1 X UNION SELECT -.123 UNION SELECT 9.1 UNION SELECT 67000 union select -1) OQ

使用子查询,然后您可以计算出一个数学公式,该公式可以给出所需的值,这样您就可以消除实际的布尔逻辑,并用数学函数替换 例如

SELECT *,(1 - ceiling(cos(atan(abs(cast(x as float)))) - 
           floor(cos(atan(abs(cast(x as float))))))) + 
           x * ceiling(cos(atan(abs(cast(x as float)))) - 
           floor(cos(atan(abs(cast(x as float)))))) as Computed
FROM
( select 0 as x union SELECT 1 X UNION SELECT -.123 UNION SELECT 9.1 UNION SELECT 67000 union select -1) OQ

如果条件和false部分仍然包含OP提到的复杂代码,那么这不是会以相同的重复结束吗?IIF以这种方式需要复制谓词和false表达式中的表达式,这正是提问者试图避免的。我似乎IIF是问题的后半部分所要求的。如果条件和假部分仍然包含OP提到的复杂代码,这不是会以相同的重复结束吗?IIF以这种方式需要复制谓词和假表达式中的表达式,这正是提问者试图避免的。我似乎IIF是问题的后半部分所要求的。太好了,这正是我想要的。非常感谢。那是什么?如果第二个参数为0,它将变为null,然后合并为1?这比我使用的更简单,即.1-CeilingCoStatanaBSCAstx作为float-FloorCoStatanAbsCastx作为float+x*CeilingCoStatanaBSCAstx作为float-FloorCoStatanAbsCastx作为floatfloat@cato . . . 是的,你已经描述了第二种方法的工作原理。太好了,这正是我想要的。非常感谢。那是什么?如果第二个参数为0,它将变为null,然后合并为1?这比我使用的更简单,即.1-CeilingCoStatanaBSCAstx作为float-FloorCoStatanAbsCastx作为float+x*CeilingCoStatanaBSCAstx作为float-FloorCoStatanAbsCastx作为floatfloat@cato . . . 是的,您已经描述了第二种方法的工作原理。您不能使用CTE或子查询吗?您不能使用CTE或子查询吗?您仍然有一个case语句,尽管我看到了其中的要点。您仍然有一个case语句,尽管我看到了其中的要点