Re: case statement within insert - Mailing list pgsql-general

From tango ward
Subject Re: case statement within insert
Date
Msg-id CAA6wQL+Y5MnsxtVx_NNwV1bissNPzvmfu05fQzcf+iLDS9FbOQ@mail.gmail.com
Whole thread Raw
In response to Re: case statement within insert  (Adrian Klaver <adrian.klaver@aklaver.com>)
List pgsql-general

On Fri, May 25, 2018 at 10:19 PM, Adrian Klaver <adrian.klaver@aklaver.com> wrote:
On 05/25/2018 07:05 AM, Adrian Klaver wrote:
On 05/25/2018 06:52 AM, Adrian Klaver wrote:
On 05/25/2018 02:04 AM, tango ward wrote:


I want to insert data from mysql into a table in postgresql. I want to check when the subjectcode contains PE or NSTP so I can assign True or False to another column in destination DB.


# Source data:

  # Source data: MySQL
    curr_msql.execute(''' SELECT code, subjectname
                           FROM test_subj ''')

# Destination
for row in curr_msql:
             curr_psql.execute(''' INSERT INTO subs (
                                                     created, modified,
                                                     subjcode, subjname,
                                                     is_pe_or_nstp)

                                   VALUES (current_timestamp, current_timestamp,
                                           %s, %s,
                                           CASE
         WHEN code like '%%PE%%' or code like '%%NSTP%%'

Shouldn't the above be?:

subjcode like '%%PE%%' or subjcode like '%%NSTP%%'

Turns out that won't work as you cannot refer to a column in the CASE:

cur.execute("insert into  cell_per(category, cell_per, season, plant_type, short_category)  values('herb test', 1, 'annual', CASE WHEN category like '%%herb%%' THEN 'herb' ELSE 'flower' END, 'ht' )")

ProgrammingError: column "category" does not exist
LINE 1: ...gory)  values('herb test', 1, 'annual', CASE WHEN category l...
                                                              ^
HINT:  There is a column named "category" in table "cell_per", but it cannot be referenced from this part of the query.


This works:

cur.execute("insert into  cell_per(category, cell_per, season, plant_type, short_category)  values(%s, 1, 'annual', CASE WHEN %s like '%%herb%%' THEN 'herb' ELSE 'flower' END, 'ht' )", ('herb test', 'herb test'))


So change code to row['code']?

Insufficient caffeine.

...
WHEN %s like '%%PE%%' or %s like '%%NSTP%%'

...
,  (row['code'], row['subjectname'], row['code'], row['code'])

FYI this is why I like the named parameters then the above could be shortened to:

{'code': row['code'], 'subjectname': row['subjectname']}

and you get clearer query code:

VALUES (current_timestamp, current_timestamp,
                                          %(code)s, %(subjectname)s,
                                          CASE
        WHEN %(code)s like '%%PE%%' or %(code)s like '%%NSTP%%'

        THEN True
        ELSE False
    END)





         THEN True
         ELSE False
     END) ''', (row['code'], row['subjectname']))

I am getting TypeError: not all arguments converted during string formatting.

Any advice pls?












--
Adrian Klaver
adrian.klaver@aklaver.com

 
Using %s works. I also learned that if I just use '%PE%' or '%NSTP%', the LIKE expression will treat them as placeholder. Solution is to double the percent signs.


Thanks a lot guys! I love you all.

pgsql-general by date:

Previous
From: "David G. Johnston"
Date:
Subject: Re: existence of a savepoint?
Next
From: Erwin Brandstetter
Date:
Subject: How to reply to an existing bug?