SQL Строка Соответствие между столбцами и возвращаемые результаты - PullRequest
0 голосов
/ 07 января 2020

У меня есть следующий набор данных. я пытаюсь сопоставить строку в Col = "Str_B_Class" со всей строкой в ​​col = "Str_A". У столбца str_A есть данные как class: value. если класс найден в Str_A, то sql должен получить значение после двоеточия в требуемый_колонку_выходов, в противном случае 0

Проблема с кодом ниже состоит в том, что если его допустим, скажем, найдено 3132, а значение 10, то вместо этого, если возвращается 1 строка, в которой найдено 3132, она возвращается 6 раз. поэтому он взрывает весь набор данных. Мне нужна помощь в сопоставлении строки без разбора всей таблицы.

Customer_ID ||                   Str_A                     || Str_B_Class || Desired_Output
-------------------------------------------------------------------------------------------    
    A1      || 121:8|188:8|3123:10|3125:10|3131:10|3132:10 || 3132        || 10
    A1      || 121:8|188:8|3123:10|3125:10|3131:10|3132:10 || 3125        || 10
    A1      || 121:8|188:8|3123:10|3125:10|3131:10|3132:10 || 4141        || 0

Запрос:

select 
    s.Customer_Id, 
    s.Str_A,  
    s.Str_B_Class, 
    case when s.instance_id = s.Str_B_Class 
        then s.Count_of_instances 
        else '0' 
    end AS Desired_Output 
from ( 
    select 
        Customer_Id, Str_A,  
        Str_B_Class, 
        explode(str_to_map(Str_A,'[|]','[:]')) as (instance_id, Count_of_instances) 
    from my_table 
) as s

Ответы [ 2 ]

1 голос
/ 07 января 2020

Используйте Str_B_Class в качестве параметра для индексации карты, созданной STR_TO_MAP:

SELECT
    Customer_Id, Str_A, Str_B_Class, 
    NVL(STR_TO_MAP(Str_A,'[|]','[:]')[Str_B_Class], '0') as Desired_Output 
FROM my_table

Хорошего дня:)

0 голосов
/ 07 января 2020

В кусте explode - это UDTF, который может генерировать несколько строк для одной строки. В то время как для вашего случая требуется отношение один к одному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...