Re: case statement within insert - Mailing list pgsql-general
From | Adrian Klaver |
---|---|
Subject | Re: case statement within insert |
Date | |
Msg-id | 9730aa5a-a2ac-4f1a-618c-50f377d2ab1a@aklaver.com Whole thread Raw |
In response to | Re: case statement within insert (Adrian Klaver <adrian.klaver@aklaver.com>) |
Responses |
Re: case statement within insert
|
List | pgsql-general |
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
pgsql-general by date: