View Full Version : IFS Filenamen aus PATH_NAME extrahieren
Genau, die Tiefe der Subdirectories spielt hier keine Rolle, es wird der gesamte Pfad damit ausgeschlossen, sodass immer nur der Filename hier greift.
Dankeschön, dann werden wir das installieren.
Zu Regex siehe hier:
https://www.itjungle.com/2015/05/19/fhg051915-story01/
"The new Regular Expression Functions Require licensed product #39 5770-SS1 International Components for Unicode to be installed on both IBM i 7.1 and 7.2. (This product is free with IBM i.)"
Du kannst erst mal versuchen, ob du den Split hast.
https://www.ibm.com/support/pages/systoolssplit
left join <code class="hljs language-plaintext-ibm">TABLE(SYSTOOLS.SPLIT(PATH_NAME, '/')) S on 1=1
Der '/' ist ggf. als '\' zu ersetzen.
Damit kannst du schon mal die Feldnamen von S.* ermitteln.
</code>
Da ich keine ibm i gerade zur Hand habe, kann ich das leider nicht selber testen.
Wenn das klappt, gehts an die OLAP-Funktion.
https://www.ibm.com/docs/en/i/7.3?topic=statement-using-olap-specifications
Dazu brauchst du eine Derived Table => Select * fom (select ....) a
left join (
select * from <code class="hljs language-plaintext-ibm">TABLE(SYSTOOLS.SPLIT(PATH_NAME, '/'))
) S
Wenn das klappt, dann
left join (
select last_value(Spaltenname) over() from <code class="hljs language-plaintext-ibm">TABLE(SYSTOOLS.SPLIT(PATH_NAME, '/'))
) S
</code>
Ansonsten musst du bis morgen warten, da habe ich wieder Zugang zu einer IBM i.
</code>
reicht dicke bis morgen, danke.
Du kannst erst mal versuchen, ob du den Split hast.
https://www.ibm.com/support/pages/systoolssplit
left join <code class="hljs language-plaintext-ibm">TABLE(SYSTOOLS.SPLIT(PATH_NAME, '/')) S on 1=1
Der '/' ist ggf. als '\' zu ersetzen.
Damit kannst du schon mal die Feldnamen von S.* ermitteln.
</code>
Da ich keine ibm i gerade zur Hand habe, kann ich das leider nicht selber testen.
Wenn das klappt, gehts an die OLAP-Funktion.
https://www.ibm.com/docs/en/i/7.3?topic=statement-using-olap-specifications
Dazu brauchst du eine Derived Table => Select * fom (select ....) a
left join (
select * from <code class="hljs language-plaintext-ibm">TABLE(SYSTOOLS.SPLIT(PATH_NAME, '/'))
) S
Wenn das klappt, dann
left join (
select last_value(Spaltenname) over() from <code class="hljs language-plaintext-ibm">TABLE(SYSTOOLS.SPLIT(PATH_NAME, '/'))
) S
</code>
Ansonsten musst du bis morgen warten, da habe ich wieder Zugang zu einer IBM i.
</code>
Irgendetwas mache ich noch falsch. Was muss ich bei Spaltennamen angeben. Der Split funktioniert.
SELECT S.*
FROM TABLE(QSYS2.IFS_OBJECT_STATISTICS('/temp/itec','YES'))
left join (select last_value(????) over() from TABLE(SYSTOOLS.SPLIT(PATH_NAME, '\')) S on 1=1
wHERE upper(PATH_NAME) LIKE '%/OLD%';
Mach doch erst mal einen
SELECT S.*
FROM TABLE(QSYS2.IFS_OBJECT_STATISTICS('/temp/itec','YES')) P
left join (select * from TABLE(SYSTOOLS.SPLIT(PATH_NAME, '\')) S on 1=1
damit du den Resultspaltennamen erfährst.
Man kanns auch kompliziert machen...
SELECT
PATH_NAME,
SUBSTR(PATH_NAME, 1, LOCATE_IN_STRING(PATH_NAME, '/', -1)) AS PATH,
SUBSTR(PATH_NAME, LOCATE_IN_STRING(PATH_NAME, '/', -1) + 1) AS FILENAME
FROM TABLE(QSYS2.IFS_OBJECT_STATISTICS('/home/PGMRSTIX','YES'))
Andreas_Prouza
14-03-23, 06:10
... deshalb sollte Regex auf jedem System installiert sein. Ist auch von der Performance um einiges schneller.
Man kanns auch kompliziert machen...
SELECT
PATH_NAME,
SUBSTR(PATH_NAME, 1, LOCATE_IN_STRING(PATH_NAME, '/', -1)) AS PATH,
SUBSTR(PATH_NAME, LOCATE_IN_STRING(PATH_NAME, '/', -1) + 1) AS FILENAME
FROM TABLE(QSYS2.IFS_OBJECT_STATISTICS('/home/PGMRSTIX','YES'))
Danke, das verstehe auch ich jetzt ;-). Ich hatte es auch schon mit dem locate versucht, aber die Erkenntnis mit dem -1 hat mir gefehlt.
Zusammenfassend vielen Dank für die Hilfe und es gibt wie immer viele Wege, die nach Rom führen.
Der für mich verständlichste Weg war LOCATE_IN_STRING, regex ist schon sehr kryptisch, aber ich werde es installieren und testen.
Wieder was gelernt, LOCATE_IN_STRING kannte ich auch noch nicht.