如何强制结果顺序

时间:2015-11-27 09:11:32

标签: sql sql-server translation

我正在编写自己的翻译,以便更好地控制我的翻译。

使用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

4 个答案:

答案 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,...')