【问题标题】:New column based on the value of another column | Oracle?基于另一列值的新列 |甲骨文?
【发布时间】:2019-08-15 02:25:00
【问题描述】:

在 Oracle 11g 数据库中,我有一个名为 organizations 的表,如下所示:

| ORGANIZATION_ID | ORGANIZATION_NAME | TREE_ORGANIZATION_ID | ORGANIZATION_RANG |
|-----------------|-------------------|----------------------|-------------------|
| 1               | Facebook          | \1                   | 1                 |
| 2               | Instagram         | \1\2                 | 2                 |
| 3               | Whatsapp          | \1\3                 | 2                 |
| 4               | Alphabet          | \4                   | 1                 |
| 5               | Nest              | \4\5                 | 2                 |
| 6               | Google            | \4\6                 | 2                 |
| 7               | YouTube           | \4\6\7               | 3                 |

如您所见,此表有一个名为 TREE_ORGANIZATION_ID 的列,我在其中存储有关组织关系的信息。

此代码返回在 TREE_ORGANIZATION_ID 列中具有特定 ID 的所有组织。在我的情况下,此代码返回 GoogleYouTube 条目。

SELECT
    *
FROM 
    ORGANIZATIONS
WHERE 
    TREE_ORGANIZATION_ID LIKE '%\' || '6'
OR
    TREE_ORGANIZATION_ID LIKE '%\' || '6' || '\%';

我想添加名为STATUS 的新列,如下所示:

| ORGANIZATION_ID | ORGANIZATION_NAME | TREE_ORGANIZATION_ID | ORGANIZATION_RANG | STATUS   |
|-----------------|-------------------|----------------------|-------------------|----------|
| 6               | Google            | \4\6                 | 2                 | root     |
| 7               | YouTube           | \4\6\7               | 3                 | not root |

我尝试了下一个代码,但它引发了错误ORA-00937 not a single-group group function

如何根据另一列的值创建新列?

SELECT
    ORGANIZATION_ID,
    ORGANIZATION_NAME,
    TREE_ORGANIZATION_ID,
    CASE
        WHEN ORGANIZATION_RANG = MIN(ORGANIZATION_RANG) THEN 'root'
        ELSE 'not root'
    END AS STATUS
FROM 
    ORGANIZATIONS
WHERE 
    TREE_ORGANIZATION_ID LIKE '%\' || '6'
OR
    TREE_ORGANIZATION_ID LIKE '%\' || '6' || '\%';

【问题讨论】:

  • ORGANIZATION_RANG = MIN(ORGANIZATION_RANG) ?

标签: sql oracle


【解决方案1】:

你可以试试下面-

SELECT
    ORGANIZATION_ID,
    ORGANIZATION_NAME,
    TREE_ORGANIZATION_ID,
    CASE
        WHEN TREE_ORGANIZATION_ID LIKE '%\' || '6' THEN 'root'
        when TREE_ORGANIZATION_ID LIKE '%\' || '6' || '\%' then 'not root'
    END AS STATUS
FROM 
    ORGANIZATIONS
WHERE 
    TREE_ORGANIZATION_ID LIKE '%\' || '6'
OR
    TREE_ORGANIZATION_ID LIKE '%\' || '6' || '\%'

【讨论】:

    【解决方案2】:

    您想使用分析函数,而不是聚合函数:

    SELECT ORGANIZATION_ID, ORGANIZATION_NAME, TREE_ORGANIZATION_ID,
           (CASE WHEN ORGANIZATION_RANG = MIN(ORGANIZATION_RANG) OVER ()
                 THEN 'root'
                 ELSE 'not root'
            END) AS STATUS
    FROM ORGANIZATIONS O
    WHERE TREE_ORGANIZATION_ID || '\' LIKE '%\' || '6' || '\%';
    

    请注意,这也简化了匹配 6 的逻辑,方法是测试组织 ID,并在末尾加上反斜杠。您也可以为此使用REGEXP_LIKE()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2017-01-24
      • 2013-09-05
      相关资源
      最近更新 更多