【问题标题】:CASE WHEN bit THEN 'something' ELSE null END shortcutCASE WHEN bit THEN 'something' ELSE null END 快捷方式
【发布时间】:2016-02-09 00:58:19
【问题描述】:

MS SQL Server 中是否有用于调用 CASE WHEN bit THEN 'something' ELSE null END 的快捷方式?有没有办法改写?

示例场景:

DECLARE @data TABLE(IsSomething BIT NOT NULL, Value NVARCHAR(30) NOT NULL);

INSERT INTO @data VALUES
(1, 'a'),
(1, 'b'),
(0, 'c'),
(0, 'd');

SELECT
CASE WHEN IsSomething = 1 THEN Value ELSE NULL END,
CASE WHEN IsSomething = 1 THEN 'string' ELSE NULL END,
CASE WHEN IsSomething = 0 THEN 'not ' + Value ELSE NULL END
FROM @data

我特别在寻找 BIT 值为 1(真)的变体。

关注的是 select 语句的可读性和为简单的 case/if 编写的过长的表达式。

我在最困扰我的观点之一中使用了这些表达方式。我并不是说该视图或表格的设计是理想的。 (其实并不理想!)

【问题讨论】:

  • 我真的不明白你想要做什么
  • 请添加您想要的输出
  • SQL Server 2012(及更高版本)具有inline if。用法:IIF(布尔表达式,'真输出','假输出')。 @SeanLange 提出了一个很好的观点,如果你不将位限制为非空值,你可能会在这里绊倒。
  • ELSE NULL 可以删除,这是暗示的。越短并不总是越好。
  • @SeanLange 请注意,(ANSI) SQL 布尔值也有三个值——真、假和未知。不过还是不是bit :)

标签: sql-server


【解决方案1】:

您可以使用 IIF (SQL Server 2012+),它应该是 CASE 的简写,但在我看来,查询最终变得更不可读(尽管这可能是我的习惯问题):

SELECT
    IIF(IsSomething = 1, Value1, NULL) AS val1,
    IIF(IsSomething = 1, Value2, NULL) AS val2,
    IIF(IsSomething = 0, Value3, NULL) AS val3
FROM @data

【讨论】:

    【解决方案2】:

    不知道你会认为什么是快捷方式,但你可以这样写:

    CASE IsSomething
     WHEN 1 THEN 'SomeThing'
     ELSE NULL
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      相关资源
      最近更新 更多