Announcement

Collapse
No announcement yet.

TSQL in PostgreSQL bräuchte Hilfe

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TSQL in PostgreSQL bräuchte Hilfe

    Hallo PostgreSQL Jünger:

    ich habe hier gerade eine TSQL Abfrage die ich genauso auch in PostgreSQL abfragen will. Jedoch finde ich nichts vergleichbares.

    Code:
    declare @Eingabe2 nvarchar(200)
    declare @Ausgabe2 nvarchar(200)
    declare @Ausgabe3 nvarchar(200)
    declare @start2 int
    declare @start3 int
    declare @ende2 int
    declare @ende3 int 
    
    set @Eingabe2= 'OX S15 Silber: 5152,3 kg Gold: 9,016525 to StinkeLuft: 1643,648 Nm^3'
    
    set @start2 = charindex('Gold: ' , @Eingabe2,0)+6
    
    set @Ende2 = charindex(' ' , @Eingabe2 ,@start2)
    set @ende3 = CHARINDEX(' ',@Eingabe2,(@ende2+1))
    
    set @ausgabe2 = substring(@Eingabe2,@start2, (@ende2 - @start2))
    set @ausgabe3 = SUBSTRING(@Eingabe2,@ende2, (@ende3 - @ende2))
    select @Ausgabe2 as Wert, @Ausgabe3 as Einheit
    Wie oben stehend würde ich es in TSQL umsetzen. Kann mir jemand einen Tipp geben? Ist es überhaupt möglich nach Zeichenketten und Bedingungen zu suchen?

  • #2
    mmh, nicht sehr übersichtlich.

    Ich würde daraus eine Funktion machen:
    http://www.postgresql.org/docs/9.1/s...xfunc-sql.html
    Das kann man dann auch direkt in SQL weiterverwenden.

    alternativ kannst Du vielleicht mit "with" arbeiten, siehe hier:
    http://stackoverflow.com/questions/1...stgresql-query
    WITH myconstants as (SELECT '5'::text as myvar FROM anywhere_unimportant)

    SELECT *
    FROM somewhere
    WHERE something IN (SELECT myvar FROM myconstants)
    Ja und die ganzen Variablen kann man sich auch sparen und Gold und Einheit in einem einzigen Select berechnen. Dabei muss man ggF. die Start/Ende Berechnung mehrfach ausführen.

    Ja und dann kann man noch sowas wie regexp_replace Funktion nutzen, die das alles in einem erledigt.
    Gruß, defo

    Comment


    • #3
      Ist es überhaupt möglich nach Zeichenketten und Bedingungen zu suchen?
      Was meinst du mit nach Bedingungen suchen Oder meinst du einfach nur eine bedingte Suche in einer Zeichenkette?

      Comment


      • #4
        wieso nicht übersichtlich?? Es zeigt doch ganz gut welches Ergebnis erreicht werden soll. Ziel ist es eine Zeichenfolge zu suchen und wenn diese gefunden wurde so lange einzulesen bis ein Leerzeichen kommt.
        Klar am ende könnte man das in einem select und oder eine Funktion unterbringen. aber es ist ja auch nur zur Veranschaulichung für Tsql welches nun eben in postgresql umgesetzt werden soll.
        Problem ist bis jetzt nur das ich postgresql mit Position keine startposition mitgeben kann.

        Comment


        • #5
          hier ein Ansatz von mir wie ich vorgehen würde. Ich würde mit Position die Position der gewünschten Zeichenkette suchen. Nehmen wir an ich suchen 'S15 ' dann wäre das Stelle 4 wo die Zeichenkette beginnt. danach würde ich einen weiteren Suchlauf starten der nach den nächsten Leerzeichen des gefunden Ausdrucks sucht! und genau hier ist die Schwachstelle meiner Theorie T-SQL kann das aber in postgresql habe ich noch nichts gefunden was der "Suche" beibringt das es erst nach den gefundenen Ausdruck anfangen soll zu sucnen.

          Ich hoffe das ist nun klarer

          Comment


          • #6
            http://www.postgresql.org/docs/9.4/s...ns-string.html

            Position im string per 'position(substring in string)'
            Auslesen ab dieser Position dann per 'substring(string [from int] [for int])'

            Alternativ gibt es auch Überladungen von substring die einen Regex annehmen.

            Edit:

            Ok ist ein wenig schwieriger als ich mir das vorgestellt habe.
            Siehe http://sqlfiddle.com/#!15/47e96/14/0
            Am extrahieren der Einheit muß man noch ein wenig basteln
            Zuletzt editiert von Ralf Jansen; 28.05.2015, 21:53.

            Comment


            • #7
              WOW! schöne schlanke Syntax wenn ich überlege was ich da in T-SQL anstellen muss um das hinzubekommen!

              danke für eure Hilfe und ein besonderer Dank an dich Ralf vor allem für die nächtliche Hilfe!

              Comment


              • #8
                Sorry Jungs aber leider habe ich mich zu früh gefreut. Der Source ist soweit ok aber die Bedingung für for muss dynamisch werden. Das heißt das Ende soll durch for dynamisch gesetzt werden, da der auszulesende Wert nicht immer gleich lang ist.

                Comment


                • #9
                  Naja, sowas in der Art meinte ich mit "unübersichtlich". Eine Frage ala 'Das Wort nach Gold als Wert und das Wort nach Wert als Einheit' wäre auch recht deutlich gewesen.

                  Versuch mal mit substring und RegEx, etwa so:
                  [highlight=SQL]
                  select
                  substring(
                  'OX S15 Silber: 5152,3 kg Gold: 9,016525 to StinkeLuft: 1643,648 Nm^3'
                  from '% Gold: #"[0-9]+,[0-9]+#"%' for '#') as Wert,
                  substring(
                  'OX S15 Silber: 5152,3 kg Gold: 9,016525 to StinkeLuft: 1643,648 Nm^3'
                  from '% Gold: [0-9]+,[0-9]+ #"[a-z]+#"%' for '#') as Einheit
                  ;
                  [/highlight]

                  Ob das immer zu Deinen Daten passt, musst Du selbst rausfinden und ggF. die Ausdrücke adaptieren.
                  P.S.: die 'From' Notation in Substring definiert eine Escape Zeichen, mit dessen Hilfe der Rückgabewert markiert wird.
                  Gruß, defo

                  Comment


                  • #10
                    Originally posted by deathdragon View Post
                    hier ein Ansatz von mir wie ich vorgehen würde. Ich würde mit Position die Position der gewünschten Zeichenkette suchen. Nehmen wir an ich suchen 'S15 ' dann wäre das Stelle 4 wo die Zeichenkette beginnt. danach würde ich einen weiteren Suchlauf starten der nach den nächsten Leerzeichen des gefunden Ausdrucks sucht! und genau hier ist die Schwachstelle meiner Theorie T-SQL kann das aber in postgresql habe ich noch nichts gefunden was der "Suche" beibringt das es erst nach den gefundenen Ausdruck anfangen soll zu sucnen.

                    Ich hoffe das ist nun klarer
                    Wenn ich Dich richtig verstehe, könntest Du via regexp_split_to_table() Deinen Text in einzelne Zeilen einer Tabelle umformen, ich finde nur kein Regex, der mir am Leerzeichen vor einem Wort, welches hinten ein : hat, den String teilt. Als Ergebnis hättest Du aber quasi das, was Du jetzt unnormalisiert hast, normalisiert in einer Tabelle.

                    Mal so als Ansatz.

                    Comment


                    • #11
                      Originally posted by akretschmer View Post
                      Wenn ich Dich richtig verstehe, könntest Du via regexp_split_to_table() Deinen Text in einzelne Zeilen einer Tabelle umformen..
                      Das kann wohl nicht gemeint sein, wenn man diese Vorgabe betrachtet:
                      Originally posted by deathdragon View Post
                      Code:
                      select @Ausgabe2 as Wert, @Ausgabe3 as Einheit
                      Gruß, defo

                      Comment

                      Working...
                      X