Alvaro Herrera wrote: > If you use "PATH '/'" for a column, you get the text for all the entries > in the whole XML, rather than the text for the particular row being > processed. Isn't that rather weird, or to put it differently, completely > wrong? I didn't find a way to obtain the whole XML row when you have > the COLUMNS option (which is what I was hoping for with the "PATH '/'").
Ah, apparently you need to use type XML for that column in order for this to happen. Example: insert into emp values ($$ <depts > <dept bldg="102"> <employee id="905"> <name> <first>John</first> <last>Doew</last> </name> <office>344</office> <salary currency="USD">55000</salary> </employee> <employee id="908"> <name> <first>Peter</first> <last>Panw</last> </name> <office>216</office> <phone>905-416-5004</phone> </employee> </dept> <dept bldg="115"> <employee id="909"> <name> <first>Mary</first> <last>Jonesw</last> </name> <office>415</office> <phone>905-403-6112</phone> <phone>647-504-4546</phone> <salary currency="USD">64000</salary> </employee> </dept> </depts> $$); Note the weird salary_amount value here: SELECT x.* FROM emp, XMLTABLE ('//depts/dept/employee' passing doc COLUMNS i for ordinality, empID int PATH '@id', firstname varchar(25) PATH 'name/first' default 'FOOBAR', lastname VARCHAR(25) PATH 'name/last', salary xml path 'concat(salary/text(), salary/@currency)' default 'DONT KNOW', salary_amount xml path '/' ) WITH ORDINALITY AS X (i, a, b, c) limit 1; i │ a │ b │ c │ salary │ salary_amount │ ordinality ───┼─────┼──────┼──────┼──────────┼───────────────────────┼──────────── 1 │ 905 │ John │ Doew │ 55000USD │ ↵│ 1 │ │ │ │ │ ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ John ↵│ │ │ │ │ │ Doew ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ 344 ↵│ │ │ │ │ │ 55000 ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ Peter ↵│ │ │ │ │ │ Panw ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ 216 ↵│ │ │ │ │ │ 905-416-5004↵│ │ │ │ │ │ ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ Mary ↵│ │ │ │ │ │ Jonesw ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ 415 ↵│ │ │ │ │ │ 905-403-6112↵│ │ │ │ │ │ 647-504-4546↵│ │ │ │ │ │ 64000 ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ ↵│ │ │ │ │ │ │ (1 fila) If you declare salary_amount to be text instead, it doesn't happen anymore. Apparently if you put it in a namespace, it doesn't hapen either. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers