如果不使用CASE语句,则值为0时返回1

时间:2019-01-18 12:13:42

标签: 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 ISVALUE(COMPLICATED CODE THAT RETURNS A SINGLE INT,0,1)

4 个答案:

答案 0 :(得分:7)

您可以使用apply

SELECT (CASE WHEN v.val = 0 THEN 1 ELSE v.val END)
FROM . . . CROSS APPLY
     (VALUES (<COMPLICATED CODE THAT RETURNS A SINGLE INT>)) v(val);

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

select coalesce(nullif(<COMPLICATED CODE THAT RETURNS A SINGLE INT>, 0), 1)

但是,我认为apply更清晰。另外,上述操作会将NULL的值转换为1以及0

答案 1 :(得分:4)

您可以将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列即可。

答案 2 :(得分:0)

您可以使用IIF

SELECT IIF(1 = 1, 'true', 'false')

https://docs.microsoft.com/en-us/sql/t-sql/functions/logical-functions-iif-transact-sql

答案 3 :(得分:-1)

使用子查询,然后您可以找出一个数学公式来提供所需的值,从而可以消除实际的布尔逻辑并替换为数学函数 一个例子是

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