Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Stored Procedure: Wie varchar iterieren? (https://www.delphipraxis.net/191135-stored-procedure-wie-varchar-iterieren.html)

BlueStarHH 12. Dez 2016 19:01

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC

Stored Procedure: Wie varchar iterieren?
 
Ich möchte in einer Stored Procedure über eine varchar-Variable iterieren und auf jeden Buchstaben zugreifen können um bestimmte Buchstaben durch etwas zu ersetzen. Im Pseudocode soll das so aussehen:

Code:
CREATE Procedure GetFoo(myString varchar(10))
  RETURNS (myreturn varchar(10))
BEGIN
 
  myreturn := '';
 
  for i := 1 to length(myString) do
    if myString[i] = 'A'
      myreturn := myreturn + 'X'
    else if myString[i] = 'A'
      myreturn := myreturn + 'Y'
    else
      myreturn := myreturn + myString[i];
    
END

jobo 12. Dez 2016 20:34

AW: Stored Procedure: Wie varchar iterieren?
 
Auf die Gefahr hin, dass es nicht das richtige ist. Hast Du zufällig den vorigen Thread gesehen?
http://www.delphipraxis.net/191132-s...d-mit-sql.html

IBExpert 12. Dez 2016 20:38

AW: Stored Procedure: Wie varchar iterieren?
 
variante 1: nutze die replace funktion
http://www.ibexpert.net/ibe/index.php?n=Doc.REPLACE

Variante 2: so was in der Art mit substring

Code:
create procedure repl
(val varchar(10))
returns
(res varchar(10))
as
declare variable c char(1);
begin
  res='';
  while (char_length(val)>0) do
  begin
    c=substring(val from 1 for 1);
    val=substring(val from 2 for 10);
    if (c='A') then c='1'; else
    if (c='C') then c='3';
    res=res||c;
  end
  suspend;
end

select repl.res from repl('ABCDEFGHIJ');
Wichtiger Hinweis noch: O.a. Verfahren nicht mit BLOB Variablen machen , siehe http://tracker.firebirdsql.org/browse/CORE-5114

BlueStarHH 13. Dez 2016 13:40

AW: Stored Procedure: Wie varchar iterieren?
 
@IBExpert: Danke das klappt.

Jetzt habe ich nur das Problem, dass ich beim String-Vergleich
if (c='A') then
zwischen Groß- und Kleinschreibung unterscheiden muss. c='a' und c='A' sollen also unterschiedlich behandelt werden. Momentan wird ist die Schreibweise aber egal.

IBExpert 15. Dez 2016 21:08

AW: Stored Procedure: Wie varchar iterieren?
 
dann nimm doch einfach upper() oder lower()

BlueStarHH 16. Dez 2016 06:56

AW: Stored Procedure: Wie varchar iterieren?
 
Zitat:

Zitat von IBExpert (Beitrag 1356281)
dann nimm doch einfach upper() oder lower()

Ich verstehe gerade nicht, wie mir das helfen sollte. Also nochmal zur Verdeutlichung: Ich übergebe ein großes A oder ein kleines a an die StoredProcedure. Innerhalb der StoredProcedure muss ich erkennen können, ob es ein großes oder kleines a ist. Der Verglich c='a' und c='A' liefert aber immer true, egal was der StoredProcedure übergeben wird. upper() oder lower() wären die Lösung, wenn die Schreibweise egal sein soll. Hier möchte ich jedoch die Schreibweise unterscheiden.

IBExpert 16. Dez 2016 07:41

AW: Stored Procedure: Wie varchar iterieren?
 
bei mir wir ein kleines a nicht ersetzt, weil 'a'<>'A' ist
habe das gerade mit einer fb25 und einer fb3 DB getestet

BlueStarHH 16. Dez 2016 07:55

AW: Stored Procedure: Wie varchar iterieren?
 
Zitat:

Zitat von IBExpert (Beitrag 1356295)
bei mir wir ein kleines a nicht ersetzt, weil 'a'<>'A' ist
habe das gerade mit einer fb25 und einer fb3 DB getestet

Ich habe hier fb25 embedded mit einer fb 25 DB mit Deinem IBExpert. Deine "repl" SP von oben nochmal reinkopiert und mit

select repl.res from repl('abc'); -> 1b3
select repl.res from repl('ABC'); -> 1B3

aufgerufen.

Was könnte dafür verantwortlich sein? Spielt da irgendwie eine Zeichensatz/String/Sortier-Defintion mit rein? In meiner DB nutze ich UTF8 / UNICODE_CI_AI in allen VarChar-Feldern. Dabei ist dann ja auch die Schreibweise egal. Aber das dürfte ja in keiner Verbindung zu der StoredProcedure stehen?! Oder gibt es da eine globale DB-Einstellung?

dataspider 16. Dez 2016 09:19

AW: Stored Procedure: Wie varchar iterieren?
 
Das CI in UNICODE_CI_AI steht IMHO für Case Insensitive.

Also könnte das schon das Problem sein.

Frank

BlueStarHH 16. Dez 2016 10:47

AW: Stored Procedure: Wie varchar iterieren?
 
Zitat:

Zitat von dataspider (Beitrag 1356324)
Das CI in UNICODE_CI_AI steht IMHO für Case Insensitive.

Also könnte das schon das Problem sein.

Wie genau? In der StoredProcedure oben aus Post #3 wird explizit kein VarChar-Feld benutzt, das UNICODE_CI_AI ist. Ich nutzte die SP genau so, wie in Post #3 genannt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz