【问题标题】:How to view a string or update a column on a database table depending on the values of other columns?如何根据其他列的值查看字符串或更新数据库表上的列?
【发布时间】:2010-11-04 07:49:12
【问题描述】:

我有一个这样的数据库表:-

表1

Column1 : Varchar(50)
Column2 : Varchar(50)
Column3 : Boolean
Column4 : Varchar(50)
Column5 : Varchar(50)

我想在运行 SQL 语句时创建一个虚拟列 - 或向表中添加一个新列 - 以便该列将包含一个字符串,指示行项的状态取决于多个这些列。我的意思是这些列是否有 Null 值。

一种合乎逻辑的表示方式:-

选择开关 DummyColumn

"status1" Case column1 IS NOT NULL
"status2" Case column2 IS NOT NULL
"status3" Case column3 IS NOT NULL
"status4" Case column1 IS NOT NULL AND column2 IS NOT NULL
"status5" Case column2 IS NOT NULL AND column3 IS NULL
"status6" Case column2 IS NOT NULL OR column3 IS NOT NULL

来自表 1;

在业务逻辑中,我可以说我想显示一个字符串,指示数据库中项目的状态,这取决于许多其他可能是布尔或字符串的状态列,并且此状态可以根据存储的值具有许多值在这些表格列中。

我的数据库引擎是 Sybase。

我如何构建我的 SQL 查询来做到这一点?这件事叫什么?我怎样才能找到或搜索那个?我不知道我会在什么主题中找到这个?我搜索合并、连接、替换、NVL 和联合,但我没有找到我想要的..

在此先感谢,我希望我能很好地表达我的问题,并且它是重复的,我希望尽快找到一个好的答案..

【问题讨论】:

  • @user493325,你知道Status6永远不会被返回,因为它会被Status1或Status2覆盖,即使Status4和Status5不适用?

标签: sql database null sybase switch-statement


【解决方案1】:

使用单个 CASE 子句:

SELECT  Column1,
        Column2,
        Column3,
        Column4,       
        Column5,
        Column6,
        CASE WHEN Column1 IS NOT NULL AND Column2 IS NOT NULL THEN 'status4'
             WHEN Column2 IS NOT NULL AND Column3 IS NULL THEN 'status5'
             WHEN Column1 IS NOT NULL THEN 'status1'
             WHEN Column2 IS NOT NULL THEN 'status2'
             WHEN Column3 IS NOT NULL THEN 'status3'
             WHEN Column2 IS NOT NULL OR Column3 IS NOT NULL THEN 'status6'
        END  AS Dummy_Column
FROM    Table1

注意。 Status6 永远不会被返回,因为它会被 Status1 或 Status2 覆盖,即使 Status4 和 Status5 不适用。

【讨论】:

  • 如果你需要根据状态进行选择,最简单的方法是把像班尼斯特这样的查询包装在一个外部查询中,这样你就可以对“Dummy_column”进行操作,而不需要重复整个case语句.此外,不要为此在数据库中添加列。它是可派生的,因此每次需要时都可以即时派生它。这样您就不必担心它会与底层数据不同步。
  • @Jay - 或者您可以根据上述查询设置数据库视图,然后根据需要使用该视图。
  • @Bannister:是的,取决于您是否只需要为一个查询执行此操作,在这种情况下,我不会进行视图,因为它只会将代码分成两个位置;或者你打算在很多地方使用它,在这种情况下,一个视图就意味着不重复你自己。
【解决方案2】:

给猫剥皮的方法不止一种,这就是其中之一。

SELECT  t.Column1
        , t.Column2
        , t.Column3
        , t.Column4        
        , t.Column5
        , t.Column6
        , COALESCE(Status1, Status2, Status3, Status4, Status5, Status6) AS DummyColumn
FROM    (
          SELECT  *
                  , CASE WHEN Column1 IS NOT NULL THEN 'status1' ELSE NULL END AS Status1
                  , CASE WHEN Column2 IS NOT NULL THEN 'status2' ELSE NULL END AS Status2
                  , CASE WHEN Column3 IS NOT NULL THEN 'status3' ELSE NULL END AS Status3
                  , CASE WHEN Column1 IS NOT NULL AND Column2 IS NOT NULL THEN 'status4' ELSE NULL END AS Status4
                  , CASE WHEN Column2 IS NOT NULL AND Column3 IS NULL THEN 'status5' ELSE NULL END AS Status5
                  , CASE WHEN Column2 IS NOT NULL OR Column3 IS NOT NULL THEN 'status6' ELSE NULL END AS Status6
          FROM    Table1
        ) t

请注意,这可以使用 SQL Server,但由于不涉及神秘的构造,因此将其转换为 SyBase 应该相对容易。

【讨论】:

  • 您可能应该重新排序您的 COALESCE 子句 - 目前,状态 4 到 6 永远不会被选中,因为它们将被状态 1 到 3 覆盖。
  • 你说得对,我没有注意到这一点。这是只有 OP 才能解决的问题:要么返回 status1,要么返回 status4。改组 COALESCE 语句确实是一个解决方案。
  • 非常感谢您的回答,这给了我一个提示,让我在 Sybase T-SQL 中使用嵌套(当 .. 然后 ..)语句找到解决方案,因为我没有使用 COALESCE 和表别名但我得到了所需的结果。非常感谢其他人(尤其是马克班尼斯特)对问题和答案发表评论并使其更加清晰。
猜你喜欢
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多