PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Używanie xpath do wyodrębniania danych z kolumny XML w postgres

To działa:

WITH tbl(p_xml) AS (  -- CTE just to provide test table with xml value
   SELECT '<promotions xmlns="http://www.demandware.com/xml/impex/promotion/2008-01-31">
              <campaign campaign-id="2013-1st-semester-jet-giveaways">
                 <description>2013 1st Semester Jet Giveaways</description>
                 <enabled-flag>true</enabled-flag>
                 <start-date>2013-01-01T05:00:00.000Z</start-date>
                 <end-date>2013-07-01T04:00:00.000Z</end-date>
                 <customer-groups>
                    <customer-group group-id="Everyone"/>
                 </customer-groups>
              </campaign>
           </promotions>'::xml
    )  -- end of CTE, the rest is the solution
SELECT xpath('/n:promotions/n:campaign/n:description/text()', p_xml
           , '{{n,http://www.demandware.com/xml/impex/promotion/2008-01-31}}')
FROM   tbl;

Zwroty:

{"2013 1st Semester Jet Giveaways"}

Zwróć uwagę, jak przypisuję alias przestrzeni nazw n dla Twojej przestrzeni nazw w trzecim argumencie xpath() i używaj go na każdym poziomie xpath.

Jeśli usuniesz przestrzeń nazw XML z dokumentu, wszystko stanie się znacznie prostsze:

WITH tbl(p_xml) AS (  -- not the missing namespace below
   SELECT '<promotions>
              <campaign campaign-id="2013-1st-semester-jet-giveaways">
                 <description>2013 1st Semester Jet Giveaways</description>
                 <enabled-flag>true</enabled-flag>
                 <start-date>2013-01-01T05:00:00.000Z</start-date>
                 <end-date>2013-07-01T04:00:00.000Z</end-date>
                 <customer-groups>
                    <customer-group group-id="Everyone"/>
                 </customer-groups>
              </campaign>
           </promotions>'::xml
   )
SELECT xpath('/promotions/campaign/description/text()', p_xml)
FROM   tbl;

Czy to tylko ja, czy wszyscy są zadowoleni z json i jsonb , więc nie musimy zajmować się XML.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Porównanie tabel tymczasowych dla PostgreSQL i Oracle GTT

  2. PostgreSQL wyłącza więcej danych wyjściowych

  3. Jak mogę wysłać e-mail z wyzwalacza PostgreSQL?

  4. Postgresql zmienia typ kolumny z int na UUID

  5. Czy lepiej jest używać wielu baz danych z jednym schematem każda, czy jednej bazy danych z wieloma schematami?