【问题标题】:Case statement to determine if I should union判断我是否应该联合的案例陈述
【发布时间】:2015-07-31 08:31:36
【问题描述】:

我目前想做某种条件联合。举个例子:

SELECT  age, name
FROM    users
UNION
SELECT  25 AS age, 'Betty' AS name

假设我只想在 'users' 的计数为 >=2 时合并第二条语句,否则不要合并两者。

总之,如果表只有 2 个或更多值,我想在表中附加一行。

【问题讨论】:

  • 顺便说一句,如果您不想消除重复,请使用UNION ALL,这样会更有效。
  • 是存储过程还是表值函数还是普通查询?
  • CASE 是一个 表达式 - 它必须产生一个标量值(每行,如果是结果集的一部分)。
  • 这其实是一个子查询...

标签: sql sql-server sql-server-2012 case union


【解决方案1】:

你可以使用 一个丑陋的 hack 这样的东西,但我认为Tim's answer 更好:

SELECT  age, name
FROM    users
UNION ALL

SELECT  25, 'Betty'
WHERE (SELECT COUNT(*) FROM users) > 1;

【讨论】:

  • 为什么在第二个查询中使用 top 1 和 users 表?只需删除表格和顶部 1,因为您只是选择常量。
  • 完成了,我只是认为它是一个快速的 hack,经过深思熟虑后我意识到我可以在没有 from 的情况下做到这一点
  • 为什么是“丑陋的黑客”?它在纯 sql 中准确地说明了 OP 想要什么。
  • 这不是 hack,它产生了 OP 想要的东西。
  • 我觉得它感觉不对。我会选择 if...else,因为它更具可读性。
【解决方案2】:

如果它在存储过程中,您可以使用If...Else:

IF (SELECT COUNT(*) FROM users) < 2
 BEGIN
  SELECT  age, name
  FROM    users
  END
ELSE
  SELECT  age, name
  FROM    users
  UNION ALL
  SELECT  25 AS age, 'Betty' AS name

否则你可以试试这样的:

SELECT  age, name
  FROM    users
  UNION ALL
  SELECT  TOP 1 25 AS age, 'Betty' AS name
  FROM users
  WHERE (SELECT COUNT(*) FROM users) >= 2

请注意,我使用了UNION ALL,因为您似乎不想消除重复项。

在这里玩过:http://sqlfiddle.com/#!6/a7540/2323/0

编辑:我更喜欢Zohar's,而不是我的第二种方法。因此,如果您可以使用If....Else,则更喜欢在没有表格的情况下使用WHERE (SELECT COUNT(*) FROM users) &gt; 1。

【讨论】:

  • 在您的第二个查询中,SELECT 'Betty' FROM users 将 Betty 乘以用户数。
  • @1010:不,为什么?我用过TOP 1。但这就是我提到我更喜欢 Zohars 方法的原因。
  • 为什么是前1名?删除 top 1 和 users 表会更容易,因为它只是选择常量。
  • @SeanLange:是​​的,当然,这就是 Zohars 方法更简单、更好的原因,只是一开始我并没有想到它。我保留它,因为它正在工作。
  • @TimSchmelter 哦,对不起...错过了那部分
【解决方案3】:

类似下面的东西应该可以工作:

SELECT  age, name
FROM    users

UNION ALL

SELECT age, name
FROM (SELECT  25 AS age, 'Betty' AS name) x
CROSS APPLY (SELECT COUNT(*) FROM users) y(cnt)
WHERE y.cnt >= 2

UNION ALL 的第二部分将是NULL,以防users 表少于 2 条记录。

【讨论】:

    【解决方案4】:
    SELECT age
         , name
    FROM   users
    
    UNION
    
    SELECT 25 As age
         , 'Betty' As name
    WHERE  EXISTS (
             SELECT Count(*)
             FROM   users
             HAVING Count(*) >= 2
           )
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 2023-04-10
      • 2010-10-30
      • 2016-05-13
      相关资源
      最近更新 更多