查询从 Oracle 转换到 Firebird 时出现问题(翻译 -> 替换)

问题描述 投票:0回答:1

一开始我只想说 - 我是 sql 的自学者。我在工作中使用的程序,在 sql oracle/firebird 数据库上工作。我编写查询来改进我的工作。抱歉,代码很丑......

我在 Oracle 上编写了一个简单的查询,该查询从 kodarin 表 spqr 中转换代码。我使用了“翻译”公式。它工作完美:

SELECT t.nazwa, s.nrkln, s.datsp, s.ilosp, k.seria
FROM spqr q, sprz s, towr t, kzak k
WHERE TRANSLATE(kodqr,
    '76543210?>FEDCBA@ONMLKJIHWVUTSRQP_^]ZYX89',
    '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ]^_?>'
) like '%'||:teks1||'%'
and s.id=q.idsprz and s.idfirm=q.idfirm
and t.idfirm = s.idfirm and t.id = s.idtowr
and s.idtowr = k.idtowr and s.idfirm = k.idfirm and s.idkzak=k.id

现在我想在 Firebird 上做类似的事情。

有人可以帮我吗?

我尝试使用多个“替换”功能来实现它,它可以工作,但有些字符被翻译,有些则没有。 另外,如果没有“min”语句,这个将无法工作 - 它会给出错误: “单行子查询返回多行”

SELECT t.nazwa, s.nrkln, s.datsp, s.ilosp, k.seria
FROM spqr q
JOIN sprz s ON (s.id = q.idsprz AND s.idfirm = q.idfirm)
JOIN towr t ON (t.id = s.idtowr AND t.idfirm = s.idfirm)
JOIN kzak k ON (s.idtowr = k.idtowr AND s.idfirm = k.idfirm AND s.idkzak = k.id)
WHERE
((SELECT min(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
       REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
       REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
       REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
       REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
       REPLACE(
    kodqr,'7','0'),'6','1'),'5', '2'), '4', '3'), '3', '4'), '2', '5'),
    '1','6'),'0','7'), '8', '?'), '9','>'),
    'A', 'F'), 'B', 'E'), 'C', 'D'), 'D', 'C'), 'E', 'B'), 'F', 'A'),
     'G', '@'), 'H', 'O'), 'I', 'N'), 'J','M'),
    'K', 'L'), 'L', 'K'), 'M', 'J'), 'N', 'I'), 'O', 'H'), 'U', 'R'),
     'P', 'W'), 'R', 'U'), 'S', 'T'), 'T','S'),
    'Q', 'V'), 'W', 'P'), 'X', '_'), 'Y', '^'), 'Z', ']'), 'V', 'Q'),'S','T'),
    '>','9'),'_','X'),'?','8'),'@','G'),'^','Y'),']','Z'),'7','0'),'',''),
    '6','1'),'2','5'),'0','7')) from spqr)) like '%'||:teks1||'%'
GROUP BY t.nazwa, s.nrkln, s.datsp, s.ilosp, k.seria

我尝试了带有“case”功能的版本 - 这个版本我无法工作。

sql firebird translate firebird2.5 firebird-3.0
1个回答
0
投票

我认为你的问题的答案是@Mark Rotteveel在这个答案中写的以下函数:https://stackoverflow.com/a/29576235/7481126

CREATE OR ALTER FUNCTION TRANSLATE_func
   (text varchar(10000), 
    toReplace varchar(10000), 
    replacePattern varchar(10000))
RETURNS VARCHAR(100)
AS
   declare variable resultat varchar(100);
   declare variable cut varchar(100);
   declare variable i integer;
   declare variable position1  integer;
   declare variable letter  varchar(100);
   declare variable lenght integer;
BEGIN
   i = 1;
   resultat ='';
   lenght =  char_length(text);
   while(i <= lenght) do
   begin
       cut = substring(text from i for 1);
       position1 = position(cut, toReplace);
       if (position1 > 0) then
       begin
           letter = substring(replacePattern from position1 for 1);
           resultat = resultat||''||letter;
       end
       else 
       begin
           resultat = resultat ||''|| cut;
       end
       i = i+1;
   end
   return resultat;
END
© www.soinside.com 2019 - 2024. All rights reserved.