根据另一列的值创建新列|甲骨文?

时间:2019-08-06 10:56:12

标签: sql oracle

在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' || '\%';

2 个答案:

答案 0 :(得分:2)

您可以在下面尝试-

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' || '\%'

答案 1 :(得分:1)

您要使用分析功能,而不是聚合功能:

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' || '\%';

请注意,这还通过测试组织ID(最后带有反斜杠)来简化匹配6的逻辑。您也可以为此使用REGEXP_LIKE()