【问题标题】:T-SQL: find an empty columnT-SQL:找到一个空列
【发布时间】:2010-07-26 13:15:34
【问题描述】:

在我的表中有 10 列用于存储“项目”(游戏服务器)。当用户拿起该项目时,它应该遍历 0-9 列(名称为“I0”..“I9”)并在当前行中的列为空时返回。我无法弄清楚如何在 SQL 服务器端执行此操作。 我只能想到每列的 IF EXISTS 但这并不是很好。很高兴有任何帮助!谢谢

【问题讨论】:

  • 这看起来很像数据库设计缺陷。您应该使用 X 行来存储项目,而不是 X 列。
  • 为什么每列的EXISTS检查不好?这基本上是您想要做的,并且可能是 SQL Server 查找记录的最短路径。任何其他类型的基于游标的迭代或动态 sql 都可能不太好。
  • 问题陈述不清楚。找到空列后的预期行为是什么?行包含什么?
  • 如果您需要增加商品数量,比如 20 件商品怎么办?添加另外 10 列并更改使用 I0..I9 的每个查询?规范化数据库,这些问题往往会消失。

标签: c# .net sql-server sql-server-2005 tsql


【解决方案1】:

也许最好有表 items (user_id, item_id) 并将每个用户的计数限制为 10?

对我来说,这似乎是规范您的表格并解决您的问题的好方法。此外,您的表格结构变得更加灵活 - 您可以动态增加或减少限制。

【讨论】:

    【解决方案2】:

    在我看来,您正试图为指定的用户(行)找到一个空列。并且,一个空列包含 NULL。假设这是正确的并且忽略对正确设计的担忧,这里将返回包含 NULL 值的第一列的编号。

    SELECT CASE
        WHEN I0 IS NULL THEN 0
        WHEN I1 IS NULL THEN 1
        WHEN I2 IS NULL THEN 2
        WHEN I3 IS NULL THEN 3
        WHEN I4 IS NULL THEN 4
        WHEN I5 IS NULL THEN 5
        WHEN I6 IS NULL THEN 6
        WHEN I7 IS NULL THEN 7
        WHEN I8 IS NULL THEN 8
        WHEN I9 IS NULL THEN 9
      END AS NextColumn
    FROM MyTable
    WHERE UserID = 'Me'
    ;
    

    【讨论】:

      【解决方案3】:
      SELECT COALESCE(I0, I1, I2, I3, I4, I5, I6, I7, I8, I9) AS FirstNotNull
      FROM MyTable
      

      【讨论】:

        猜你喜欢
        • 2020-05-11
        • 1970-01-01
        • 2023-02-08
        • 2010-11-22
        • 2012-09-23
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多