🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: comp.databases.postgresql
2 messages
2 total messages Started by luca.bocchi8@gma Mon, 30 Apr 2018 14:03
lateral query with dynamic column value
#3368
Author: luca.bocchi8@gma
Date: Mon, 30 Apr 2018 14:03
152 lines
6000 bytes
I need an help with lateral subqueries: 

is it possible to perform it with a dynamically generated column name? 

I'm trying it but i'm doing it wrong:

    -- table containing column names as values
    nov=# select rsi.display_field from corp_resumesectionitem rsi limit 15;
            display_field        
    -----------------------------
     resume_attribute_00064_13
     resume_attribute_00065_13
     resume_attribute_00066_13
     resume_attribute_00067_18_1
     resume_attribute_00067_18_2
     resume_attribute_00068_1
     resume_attribute_00069_1
     resume_attribute_00070_13
     resume_attribute_00071_13
     resume_attribute_00072_13
     resume_attribute_00082_1
     resume_attribute_00083_1
     resume_attribute_00084_6
     resume_attribute_00085_13
     resume_attribute_00086_3
    (15 rows)
    
    -- import.vw_rpt_resume table contains several colum with names corresponding to the display_field values, such as 'resume_attribute_00064_13', 'resume_attribute_00065_13':
    
    nov=# select column_name from information_schema.columns where table_name='vw_rpt_resume';                                                                                                                                                              column_name             
    ------------------------------------
     user_id
     warehouse_resume_attribute_user_id
     resume_attribute_000m1_2
     resume_attribute_00032_13
     resume_attribute_00052_13
     resume_attribute_00053_13
     resume_attribute_00057_4
     resume_attribute_00058_7
     resume_attribute_00059_6
     resume_attribute_00061_3
     ...
     ...
     resume_attribute_00094_18_1
     resume_attribute_00094_18_2
     resume_attribute_00095_1
     resume_attribute_00096_13
     resume_attribute_00097_13
     resume_attribute_00098_7
     resume_attribute_00099_2
     resume_attribute_00100_13
     resume_attribute_00101_13
     resume_attribute_00102_13
    (55 rows)
    

I need to perform a query with dynamic column names inside the LATERAL subquery, bu I'm messing something up...

something like (this is more like pseudocode but it's just to give an idea):
    
    select * from (
      select
        rsi.display_field as df,
        subq.*
      from corp_resumesectionitem rsi, lateral (
        execute 'select user_id, unnest(string_to_array(' || rsi.display_field '' ', ',')) as val, ' || rsi.display_field || ' as col_name from import..vw_rpt_resume subq'
    )
    
    -- but this is not working...


each lateral query should be something like:

    select * from (
        select distinct r.user_id, r.val, m.name_display, l.rsal_value_id, l.rsal_title, m.display_field, l.culture_id
        from (
        select user_id,
          unnest(string_to_array(resume_attribute_00032_13, ',')) as val,
          'resume_attribute_00032_13' as col_name from import.vw_rpt_resume
        ) as r
      inner join import.custom_fields_mapping m
        on r.col_name::text = m.display_field
      inner join import.vw_rpt_resume_section_attribute_value_local as l
      on r.val = l.rsal_value_id) as dd;


with as result somethig like this:

    user_id | val |              name_display               | rsal_value_id |   rsal_title    |       display_field       | culture_id 
    ---------+-----+-----------------------------------------+---------------+-----------------+---------------------------+------------
    56      | 226 | Skills & Knowledge - Skills & Knowledge | 226           | Being resilient | resume_attribute_00032_13 | 1
    56      | 226 | Skills & Knowledge - Skills & Knowledge | 226           | Being resilient | resume_attribute_00032_13 | 10
    56      | 226 | Skills & Knowledge - Skills & Knowledge | 226           | Being resilient | resume_attribute_00032_13 | 11
    56      | 226 | Skills & Knowledge - Skills & Knowledge | 226           | Being resilient | resume_attribute_00032_13 | 12
    56      | 226 | Skills & Knowledge - Skills & Knowledge | 226           | Being resilient | resume_attribute_00032_13 | 13
    56      | 226 | Skills & Knowledge - Skills & Knowledge | 226           | Being resilient | resume_attribute_00032_13 | 14
    56      | 226 | Skills & Knowledge - Skills & Knowledge | 226           | Being resilient | resume_attribute_00032_13 | 15
    56      | 226 | Skills & Knowledge - Skills & Knowledge | 226           | Being resilient | resume_attribute_00032_13 | 16
    56      | 226 | Skills & Knowledge - Skills & Knowledge | 226           | Being resilient | resume_attribute_00032_13 | 17
    56      | 226 | Skills & Knowledge - Skills & Knowledge | 226           | Being resilient | resume_attribute_00032_13 | 18


but instead I got this:

                df             | user_id |            val            |         col_name          
    ---------------------------+---------+---------------------------+---------------------------
    resume_attribute_00064_13 | 525     | resume_attribute_00064_13 | resume_attribute_00064_13
    resume_attribute_00064_13 | 0       | resume_attribute_00064_13 | resume_attribute_00064_13
    resume_attribute_00064_13 | 542     | resume_attribute_00064_13 | resume_attribute_00064_13
    resume_attribute_00064_13 | 326     | resume_attribute_00064_13 | resume_attribute_00064_13
    resume_attribute_00064_13 | 564     | resume_attribute_00064_13 | resume_attribute_00064_13
    resume_attribute_00064_13 | 86      | resume_attribute_00064_13 | resume_attribute_00064_13
    resume_attribute_00064_13 | 162     | resume_attribute_00064_13 | resume_attribute_00064_13
    resume_attribute_00064_13 | 603     | resume_attribute_00064_13 | resume_attribute_00064_13
    resume_attribute_00064_13 | 803     | resume_attribute_00064_13 | resume_attribute_00064_13
    resume_attribute_00064_13 | 246     | resume_attribute_00064_13 | resume_attribute_00064_13

Any help about this?
Re: lateral query with dynamic column value
#3369
Author: Dimitri Fontaine
Date: Tue, 01 May 2018 09:50
29 lines
981 bytes
luca.bocchi8@gmail.com writes:
> I need an help with lateral subqueries:
>
> is it possible to perform it with a dynamically generated column name?

No it is not. SQL is a statically typed language, the SQL engine
(parser, executor) needs to fully determine the data type of the result
of the query before running it.

        column_name
>     ------------------------------------
>      user_id
>      warehouse_resume_attribute_user_id
>      resume_attribute_000m1_2
>      resume_attribute_00032_13
>      resume_attribute_00052_13
>      resume_attribute_00053_13
>      resume_attribute_00057_4
>      resume_attribute_00058_7
>      resume_attribute_00059_6
>      resume_attribute_00061_3

This looks like an EAV data model, which is the worst possible choice on
earth in the relational world. Normalize your data model and then it's
going to be very easy (and efficient) to write your queries.

Regards,
--
Dimitri Fontaine
https://masteringpostgresql.com
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads