一开始我只想说 - 我是 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”功能的版本 - 这个版本我无法工作。
我认为你的问题的答案是@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