【问题标题】:conditional CASE WHEN statement条件 CASE WHEN 语句
【发布时间】:2014-01-21 18:41:10
【问题描述】:

我有一个结构如下的表:

CustID | Number 1  | Number 2 | Number 3  | Number 4
    1  | 072454584 |          | 017726593 | 
    2  |           |0125456852|           | 0125785448

我正在尝试执行选择第一个可用数字的查询,因此如果使用客户 ID 2,它将仅返回数字 2,如果存在仅数字 4 的记录,它将忽略 1,2, 3.我试过做一个 case when 语句,但我似乎无法弄清楚逻辑。

【问题讨论】:

  • 我认为您应该更好地规划表格的结构
  • @Nadeem_MK 我认为你应该正确阅读这个问题。 “选择第一个可用数字的查询,因此如果使用客户 ID 2,它将仅返回数字 2,如果存在仅包含数字 4 的记录,它将忽略 1,2,3”
  • @Gavlaaa - 因为改变结构是在 SQL 问题上应该始终考虑的一件事,你应该提到你不能改变它。绝对不要滥用试图帮助的人——这不会让别人觉得有帮助
  • @Gavlaaa:不必粗鲁,Andrey Gordeev 并不是很有建设性,但他说该模型似乎是半最优是正确的。如果您有列 Number 1 - Number N 您应该更好地对其进行规范化并使用单独的表而不是列。这使得所有查询更简单、更高效。如果您计划添加更多列,它也更易于维护且不易出错。

标签: sql-server-2008 case


【解决方案1】:

如果这些列中有 NULL 值,请使用 COALESCE:

SELECT CUSTID, COALESCE(number1, number2, number3, number4)

【讨论】:

  • 没有任何空值,但很容易解决。感谢您的回答。
【解决方案2】:

您可以使用COALESCE 返回第一个非空值:

SELECT COALESCE([Number 1],[Number 2],[Number 3], [Number 4]) AS FirstNonNullNum
FROM dbo.Table1
WHERE CustID = @paramID

Demo

但是,您的模型似乎是半最优的。如果您有列 Number 1 - Number N 您应该更好地对其进行规范化并使用单独的表而不是列。这使得所有查询更简单、更高效。如果您计划添加更多列,它也更易于维护且不易出错。

【讨论】:

    猜你喜欢
    • 2022-08-17
    • 1970-01-01
    • 2016-03-12
    • 2016-12-10
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多