使用SQL 2在字符串中反转使用混合的从左到右和从右到左的语言?

时间:2018-01-08 09:47:10

标签: sql sql-server

我的表中有字符串值,包括希伯来字符(或本案例中的任何R-T-L语言)和英语字符(或数字)。

问题在于英文字符是颠倒的,看起来像是:בדיקה123456 esrever sti fI kcehC。

数字和英文字符相反,希伯来文字很好。

如何使用内置的SQL函数来识别英文子字符串(和数字)并将其反转,同时维护其他RTL字符的顺序?

我在以下链接中阅读了此问题的答案: Reverse characters in string with mixed Left-to-right and Right-to-left languages using SQL?

解决方案:

DECLARE @sourceString NVARCHAR(100) = N'123456 בדיקה esrever sti fI kcehC';
DECLARE @reversedString NVARCHAR(4000)  = nchar(8237) + REVERSE(@sourceString) +  nchar(8236)
SELECT @reversedString;

我的问题: 当我尝试使用此选项构建查询时,它不起作用例如:

select count(*) from table where nchar(8237) + REVERSE(column) +  nchar(8236) = N'‭Check If its reverse הקידב 654321‬'

我该如何解决?

1 个答案:

答案 0 :(得分:0)

SQL-Server中RTL字符串的行为,特别是混合时,有时候很奇怪。

我不确切地知道你想要实现什么,但这至少会给你unicode代码点:

DECLARE @source NVARCHAR(100)=N'123456 בדיקה esrever sti fI kcehC';

WITH cte AS
(
    SELECT 1 AS pos
          ,UNICODE(SUBSTRING(@source,1,1)) AS CodeAtPosition
    UNION ALL
    SELECT cte.pos+1
          ,UNICODE(SUBSTRING(@source,cte.pos+1,1))
    FROM cte
    WHERE pos<LEN(@source)
)
SELECT * 
FROM cte

希伯来字符来自更高的范围:

pos CodeAtPosition

1   49
2   50
3   51
4   52
5   53
6   54
7   32
8   1489 <-- starting here
9   1491
10  1497
11  1511
12  1492 <-- ending here
13  32
14  101
...more rows

有用的回答:https://stackoverflow.com/a/29821207/5089204
关于双向文本的内容:https://www.w3.org/TR/WCAG20-TECHS/H34.html