Text nach Varchar

Moin,

ich habe folgendes Problem. Ich habe einen View der eine andere Tabelle befüllt, diesen musste ich nun ändern das der die Daten von einem xpath_string holt. Dieser gibt mir dummerweise nur den datentyp text zurück, mein zielfelddatentyp ist aber varchar. da knallts natürlich.

wie kann ich dem den nun beibringen das der mir den datentyp bei der ausgabe entsprechend umwandelt? also in varchar.

 SELECT a.asset_id, a.pool_id, a.media_id, a.pub_date, a.found_time, a.status, 
a.license_level, xpath_string(a.xpwcache, '//clippingtext/origtext/title'::text) AS title, 
m.name AS media_name, xpath_string(a.clipxml, '//clip/clipinfo/medialang') AS "language", 
xpath_string(a.clipxml, '//clip/clipinfo/country') AS country 
FROM asset.asset a LEFT JOIN asset.v_media m ON m.media_id = a.media_id;

die xpath_string funktion gibt immer nur text zurück, wie kann ich den denn nach varchar casten?

den befehl create cast gibt es, wenn ich folgendes versuche:

create cast (text as integer) without function;

bekomme ich immer ein:

[B]SQL-Fehler:[/B]

ERROR:  must be owner of type text or type pg_catalog.varchar               [B]In der Anweisung:[/B]
create cast (text as varchar) without function;

wie kriege ich das denn hin?

danke schonmal,

grüße,
oli

Den Cast anzulegen bringt dir nichts, wenn du ihn letztendlich nicht benutzt.

Du könntest aber folgendes verwenden:

SELECT 'abc'::TEXT;



SELECT 'abc'::VARCHAR;



SELECT 'abc'::TEXT::VARCHAR;



SELECT 'abc'::VARCHAR::TEXT;

Mit den Möglichkeiten kannst du explizit zwischen verschiedenen Datentypen hin und her casten. Das funktioniert für alle Datentypen, für die schon Casts definiert sind - und zufällig ist das für Text und Varchar schon der Fall :wink:

mmh dank dir erstmal, aber soweit war ich vorhin auch schon.

das war mein statement:

SELECT a.asset_id, a.pool_id, a.media_id, a.pub_date, a.found_time, a.status, a.license_level, xpath_string(a.xpwcache, ‘//clippingtext/origtext/title’::text) AS title, m.name AS media_name, xpath_string(a.clipxml, ‘//clip/clipinfo/medialang’::varchar) AS “language”, xpath_string(a.clipxml, ‘//clip/clipinfo/country’::varchar) AS country FROM asset.asset a LEFT JOIN asset.v_media m ON m.media_id = a.media_id;

und das ist das ergebnis:

SQL-Fehler:

ERROR: cannot change data type of view column “language” In der Anweisung:
CREATE OR REPLACE VIEW “search”.“asset_detail_v” AS SELECT a.asset_id, a.pool_id, a.media_id, a.pub_date, a.found_time, a.status, a.license_level, xpath_string(a.xpwcache, ‘//clippingtext/origtext/title’::text) AS title, m.name AS media_name, xpath_string(a.clipxml, ‘//clip/clipinfo/medialang’::varchar) AS “language”, xpath_string(a.clipxml, ‘//clip/clipinfo/country’::varchar) AS country FROM asset.asset a LEFT JOIN asset.v_media m ON m.media_id = a.media_id;

Zieltabelle ist diese:

Table “search.asset_detail”
Column | Type | Modifiers
---------------±-----------------------±----------
asset_id | integer |
pool_id | integer |
media_id | integer |
pub_date | date |
found_time | integer |
status | integer |
license_level | integer |
title | text |
media_name | character varying(257) |
language | character varying(128) |
country | character varying(128) |
Indexes:
“search_asset_detail_asset” btree (asset_id)
“search_asset_detail_country” btree (country)
“search_asset_detail_date_pool” btree (pub_date, pool_id) CLUSTER
“search_asset_detail_found_time” btree (found_time)
“search_asset_detail_language” btree (“language”)
“search_asset_detail_license_level” btree (license_level)
“search_asset_detail_media” btree (media_id)
“search_asset_detail_media_name” btree (upper(media_name::text))
“search_asset_detail_pool” btree (pool_id)
“search_asset_detail_pool_time” btree (found_time, pool_id)
“search_asset_detail_pub_date” btree (pub_date)
“search_asset_detail_status” btree (status)
“search_asset_detail_title” btree (upper(title))


knallt halt bei language und bei country. Der xpath_string gibt explizit text zurück, eigentlich doof daß das Postgres net egal ist was da reinkommt :wink:



xpath_string(a.clipxml, '//clip/clipinfo/medialang'::varchar)

versuch mal statt dessen:

xpath_string(a.clipxml, '//clip/clipinfo/medialang'::varchar)::varchar

Andreas

Verschieb mal den Cast nach außen, an die Klammer. Du castest intern den einen Text in Hochkommas, nicht das Ergebnis.

Und normal ist es PostgreSQL egal, da Text und Varchar intern das gleiche sind.

:frowning:

leider immer noch das gleiche ergebnis:

SELECT a.asset_id, a.pool_id, a.media_id, a.pub_date, a.found_time, a.status, a.license_level, xpath_string(a.xpwcache, ‘//clippingtext/origtext/title’::text) AS title, m.name AS media_name, xpath_string(a.clipxml, ‘//clip/clipinfo/medialang’::varchar)::varchar AS “language”, xpath_string(a.clipxml, ‘//clip/clipinfo/country’::varchar)::varchar AS country FROM asset.asset a LEFT JOIN asset.v_media m ON m.media_id = a.media_id;

SQL-Fehler:

ERROR: cannot change data type of view column “language” In der Anweisung:
CREATE OR REPLACE VIEW “search”.“asset_detail_v” AS SELECT a.asset_id, a.pool_id, a.media_id, a.pub_date, a.found_time, a.status, a.license_level, xpath_string(a.xpwcache, ‘//clippingtext/origtext/title’::text) AS title, m.name AS media_name, xpath_string(a.clipxml, ‘//clip/clipinfo/medialang’::text)::varchar AS “language”, xpath_string(a.clipxml, ‘//clip/clipinfo/country’::text)::varchar AS country FROM asset.asset a LEFT JOIN asset.v_media m ON m.media_id = a.media_id;


Ich würd ja auch den datentyp in der tabelle ändern, aber die enthält 22000000 einträge und den server kann ich net mal für ein paar stunden lahmlegen :wink:

irgendwas mache ich da doch falsch? soweit ich das richtig gelesen habe gibt mir diese xpath geschichte nen text zurück, das casten scheint aber net zu funktionieren. wie kann ich das denn noch angehen? applikationsseitig ist das problem auch net zu lösen

Sage mal, erstellst du den View neu, nachdem du ihn erstellt hast? Oder versuchst du, den View zu überschreiben?

ich versuche ihn zu überschreiben

verdammt es funktioniert, kaum macht man es richtig. ich hab den view einfach neu erstellt und schon gehts.

dank euch vielmals für den zaunpfahl, manchmal braucht man sowas mal :slight_smile:

Ja, darauf wollte ich hinaus. Du kannst einen View nicht abändern. Ab PostgreSQL 8.4 kannst du den View erweitern, aber das trifft wohl auf deinen Fall auch nicht zu.

Nun, komm nächste Woche nach München, da erkläre ich all solche Sachen :wink:

das gilt zu überlegen, mal den cheffe anhauen ob der ne reise nach münchen spendiert :wink: