我正在尝试寻找一种更整齐的方法来进行以下查询,以免重复代码。
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)
答案 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