我正在编写自己的翻译,以便更好地控制我的翻译。
使用SQL Server 2008,这是英语 - 德语词典的表格:
CREATE TABLE engdeu
(
[eword] [varchar](100) NOT NULL,
[dword] [varchar](100) NOT NULL
-- clipped --
)
这是我要翻译的文字:
Berlin was the first city ...
这是将给定的英文文本翻译成德语等值语句的查询:
select *
from engdeu
where eword in ('Berlin', 'was', 'the', 'first', 'city')
这是查询的结果:
eword dword
city Stadt
first erst\e\r/es
the der/die/das
was wurde\n\war
Berlin Berlin
正如您所看到的,结果的顺序与原始英文文本的顺序不同。
如何创建一个以相同顺序生成结果的SQL:
eword dword
Berlin Berlin
was wurde\n\war
the der/die/das
first erst\e\r/es
city Stadt
答案 0 :(得分:3)
因此,这不是IN子句的任务。您必须提供有关所需订单的SQL信息。一种可能的解决方案是到达transact SQL,并将此信息存储在表变量中,并使用JOIN和ORDER BY,如下所示:
DECLARE @vartab TABLE(
text varchar(30) NOT NULL,
pos varchar(30) NOT NULL
);
INSERT @vartab
SELECT 1,'Berlin'
SELECT 2,'was'
SELECT 3,'the'
SELECT 4,'first'
SELECT 5,'city'
;
SELECT
*
FROM
@vartab vt
LEFT JOIN engdeu ed ON (vt.text = ed.word)
ORDER BY
vt.pos
由于我暂时无法测试,我的代码中出现了一些错误,但您应该了解它背后的基本想法。
Here是来自优秀文档大师的手册。
here是关于表变量的一些文本,看似更直接。
答案 1 :(得分:1)
这是我的建议:
DECLARE @tbl TABLE(eword VARCHAR(100),dword VARCHAR(100));
INSERT INTO @tbl VALUES('Berlin','Berlin')
,('was','wurde/n/war')
,('the','der/die/das')
,('first','erst/e/r es')
,('city','Stadt');
DECLARE @StringToTranslate VARCHAR(MAX)='Berlin was the first city in Germany';
WITH SplittedIntoWords AS
(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS ForceSortOrder
,The.words.value('.','varchar(max)') AS word
FROM (SELECT CAST('<x>' + REPLACE(@StringToTranslate,' ','</x><x>') + '</x>' AS XML) AS AsXml) AS DummyTbl
CROSS APPLY AsXml.nodes('x') AS The(words)
)
SELECT CASE WHEN Translation.dword IS NULL THEN '[** ' + SplittedIntoWords.word+ ' **]' ELSE Translation.dword END AS TranslatedWord
FROM SplittedIntoWords
LEFT JOIN @tbl AS Translation ON SplittedIntoWords.word=Translation.eword
ORDER BY ForceSortOrder
/* This would concatenate the result back to a sentence
SELECT STUFF(
(
SELECT ' ' + CASE WHEN Translation.dword IS NULL THEN '[** ' + SplittedIntoWords.word+ ' **]' ELSE Translation.dword END
FROM SplittedIntoWords
LEFT JOIN @tbl AS Translation ON SplittedIntoWords.word=Translation.eword
ORDER BY ForceSortOrder
FOR XML PATH('')
),1,1,'') AS OutputTranslated
*/
答案 2 :(得分:0)
这是一个简单的T-SQL脚本,它为您提供用空格分隔的任何句子的整数转换
DECLARE @engdeu TABLE(
eword varchar(30) NOT NULL,
dword varchar(30) NOT NULL
);
INSERT @engdeu
SELECT 'the','das'
union all
SELECT 'first','erste'
union all
SELECT 'city','Stadt'
union all
SELECT 'Berlin','Berlin'
union all
SELECT 'was','war'
;
/***** YOU CAN CREATE THIS PROCEDURE WITH @text(ENGLISH TEXT) AS INPUT AND HAVE @result AS AN OUTPUT *****/
DECLARE
@text varchar(200),
@word varchar(50)='',
@result varchar(200)='',
@i int
SET @text='Berlin was the first city'
SET @text=@text+' '
WHILE LEN(isnull(@text,''))>0
BEGIN
SET @word=SUBSTRING(@text,1,CHARINDEX(' ',@text)-1)
SET @text=SUBSTRING(@text,CHARINDEX(' ',@text)+1,LEN(isnull(@text,'')))
SELECT @result=@result+' '+dword FROM @engdeu WHERE eword=@word
END
SELECT SUBSTRING(@result,2,LEN(@result)-1)
答案 3 :(得分:-1)
使用FIND_IN_SET
ORDER BY FIND_IN_SET(eword, 'Berlin,was,...')
编辑:
如果FIND_IN_SET无法在Sql-server上运行,请尝试(现在不能对它进行测试)
ORDER BY CHARINDEX(eword, 'Berlin,was,...')