如何强制结果顺序
How to force the result order
我正在编写自己的翻译器以更好地控制我的翻译。
使用 SQL Server 2008 这是 table 英德词典:
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
因此,这不是 IN 子句的任务。您必须提供 SQL 有关您想要的订单的信息。一种可能的解决方案是获取交易 SQL,并将此信息存储在 table 变量中,然后仅使用 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 是一些关于 table 变量的文字,看起来更直接。
使用FIND_IN_SET
ORDER BY FIND_IN_SET(eword, 'Berlin,was,...')
编辑:
如果 FIND_IN_SET 在 Sql 服务器上不工作,请尝试(抱歉,现在无法测试)
ORDER BY CHARINDEX(eword, 'Berlin,was,...')
这是我的建议:
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
*/
这是一个简单的 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)
我正在编写自己的翻译器以更好地控制我的翻译。
使用 SQL Server 2008 这是 table 英德词典:
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
因此,这不是 IN 子句的任务。您必须提供 SQL 有关您想要的订单的信息。一种可能的解决方案是获取交易 SQL,并将此信息存储在 table 变量中,然后仅使用 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 是一些关于 table 变量的文字,看起来更直接。
使用FIND_IN_SET
ORDER BY FIND_IN_SET(eword, 'Berlin,was,...')
编辑:
如果 FIND_IN_SET 在 Sql 服务器上不工作,请尝试(抱歉,现在无法测试)
ORDER BY CHARINDEX(eword, 'Berlin,was,...')
这是我的建议:
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
*/
这是一个简单的 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)