PDA

View Full Version : IFS Filenamen aus PATH_NAME extrahieren



Seiten : [1] 2 3

itec01
13-03-23, 16:01
Hallo Zusammen,
ein Frage zum extrahieren von File und Pfad direkt im SQL wegen %Like. Der like soll sich nur auf die Files beziehen.
Beispiel:
SELECT cast(PATH_NAME as varchar(250)) path
FROM TABLE(QSYS2.IFS_OBJECT_STATISTICS('/temp','YES'))
WHERE upper(PATH_NAME) LIKE '%.TEMP%';

Es soll in der Ergebnisliste aber nur die Files mit TEMP verarbeitet werden.
Man müsste PATH_NAME in PATH und FILENAME extrahieren und dann über FILENAME den %Like machen, aber nur wie?

Wenn es zu kompliziert wird, dann werde ich es im RPG auseinander nehmen.

Vielen Dank schon mal.
Gruß Klaus

Fuerchau
13-03-23, 16:18
In etwa so:

join (
select last_value(text) over() from <code class="hljs language-plaintext-ibm">TABLE(SYSTOOLS.SPLIT(PATH_NAME, '/'))
)

Wobei "text" mit dem Namen der Ergebnisspalte von Split zu ersetzen ist.
</code>

Andreas_Prouza
13-03-23, 16:23
Auch hier wieder mit Regex einfach den Pfad entfernen.


where regexp_like(path_name, '/[^/]*\.temp[^/]*$', 'i')

\. = der Punkt ist ein Steuerzeichen und muss deshalb mit \ escaped werden
[^/] = Steht für ein beliebiges Zeichen welches KEIN "/" ist. Dadurch wird sichergestellt, dass wir hier keinen Pfad haben.
* = Das davor stehende Zeichen kann 0-n mal vorkommen
$ = Ende des Zeichens
'i' = ignoriere Groß/Kleinschreibung

lg Andreas

itec01
13-03-23, 16:28
Auch hier wieder mit Regex einfach den Pfad entfernen.


where regexp_like(path_name, '/[^/]*\.temp[^/]*$', 'i')

\. = der Punkt ist ein Steuerzeichen und muss deshalb mit \ escaped werden
[^/] = Steht für ein beliebiges Zeichen welches KEIN "/" ist. Dadurch wird sichergestellt, dass wir hier keinen Pfad haben.
* = Das davor stehende Zeichen kann 0-n mal vorkommen
$ = Ende des Zeichens
'i' = ignoriere Groß/Kleinschreibung

lg Andreas

Hallo Andreas, regexp_like wird nicht gefunden, was ist das und würde das auch die subdirectories entfernen, so dass der Filename alleine steht?

Fuerchau
13-03-23, 16:32
SQL Regex muss als zusätzliches Feature (kostenlos) installiert werden.

Andreas_Prouza
13-03-23, 16:33
Genau, 5770SS1 Option 39 „International Components for Unicode“.
Hat keine zusätzliche Kosten und sollte auf jeder IBM i installiert werden.

itec01
13-03-23, 16:33
SQL Regex muss als zusätzliches Feature (kostenlos) installiert werden.
OK, vielen Dank, das kannte ich bisher nicht.

Andreas_Prouza
13-03-23, 16:35
Hallo Andreas, regexp_like wird nicht gefunden, was ist das und würde das auch die subdirectories entfernen, so dass der Filename alleine steht?
Genau, die Tiefe der Subdirectories spielt hier keine Rolle, es wird der gesamte Pfad damit ausgeschlossen, sodass immer nur der Filename hier greift.

itec01
13-03-23, 16:42
In etwa so:

join (
select last_value(text) over() from <code class="hljs language-plaintext-ibm">TABLE(SYSTOOLS.SPLIT(PATH_NAME, '/'))
)

Wobei "text" mit dem Namen der Ergebnisspalte von Split zu ersetzen ist.
</code>

<code class="hljs language-plaintext-ibm">Danke, Puuh, not so easy. Wie kann ich das mit meinem SQL von oben "verwurschteln". Wäre super und vielen Dank schon mal.
</code>

Fuerchau
13-03-23, 17:08
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>