【问题标题】:conditional field selection oracle条件字段选择oracle
【发布时间】:2012-10-16 03:57:42
【问题描述】:

我知道我可以在我的编程语言中做到这一点,但我想尝试在 SQL 中做到这一点,这样我就不必打扰任何前端代码。

我有一个包含三个名称字段的表 - name1、name2、name3。

这些字段中的任何一个或所有字段中可能存在随机值。

我想要一个返回三个字段的查询,

它将检查 name1,name2,name3 - 哪个第一个字段有值进入 first_name, 哪个第二个字段有值进入 second_name,然后是第三个字段。

我可以轻松地编写一个 CASE-END 语句来填充 first_name,但是当我开始编写 second_name 的逻辑时,它变得更加复杂。

SQL:

SELECT 
  CASE
    WHEN NAME1 IS NOT NULL
    THEN NAME1
    ELSE
      CASE
        WHEN NAME2 IS NOT NULL
        THEN NAME2
        ELSE
          CASE
            WHEN NAME3 IS NOT NULL
            THEN NAME1
            ELSE ''
          END
      END
  END FIRST_NAME
  FROM TABLE_NAME

现在,我该如何处理 second_name 和 third_name?还是他们更简单的方法?

任何帮助表示赞赏..

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    你可能会做类似的事情

    SELECT coalesce( name1, name2, name3 ) first_name,
           (case when name1 is not null 
                 then nvl( name2, name3 )
                 when name2 is not null
                 then name3
                 else null
             end) second_name,
           (case when name1 is not null and
                      name2 is not null
                 then name3
                 else null
             end) third_name
      FROM your_table
    

    但是,这样做的愿望似乎表明您有需要解决的数据模型问题。如果您有三列显然都存储相同的数据,则该表未正确规范化。如果您将名称存储在与现有表具有 1:n 关系的单独表中,这将是一个更好的数据模型(并且更容易查询)。

    【讨论】:

    • 你,先生,太棒了!这件漂亮的作品正是我需要的!我知道你对表结构和东西的意思 - 但它太旧了一个我无法修改的遗留系统(也是我不接触前端代码并在 SQL 中处理它的原因)再次感谢,我希望我能不止一次为你的答案竖起大拇指! 快乐
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    相关资源
    最近更新 更多