Обратные символы в строке со смешанными левыми и правыми языками с использованием языка SQL?

У меня есть строковые значения в моей таблице, которые включают ивритские символы (или любой язык R-T-L для этого случая) и английские (или цифры).

Проблема в том, что английские символы обращаются вспять и выглядят так: בדיקה 123456 esrever sti fI kcehC. Цифры и английские символы отменены, иврит - в порядке.

Как я могу использовать встроенные функции SQL для идентификации английской подстроки (и чисел) и отменить ее, сохраняя порядок на других RTL-символах? Любое обходное решение будет делать:-)... спасибо

Ответ 1

Я считаю, что вся ваша строка отменена, и тот факт, что еврейские слова отображаются в правильном порядке, на самом деле является результатом другой проблемы. Я подозреваю, что ивритские слова хранятся в не-лексическом порядке.

В теории вы должны решить свою проблему, просто изменив строку, а затем заставите SQL Server отображать арабские слова слева направо. Это делается добавлением специального символа к передней и задней части строки следующим образом:

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

    DECLARE @reversedString NVARCHAR(4000)  = nchar(8237) + REVERSE(@sourceString) +  nchar(8236)

    SELECT @reversedString;

Ответ 2

Я никогда не работал с ивритскими персонажами, поэтому я не уверен, что это сработает,

Однако я думаю, что вы можете реализовать функцию с циклом while, используя patindex

  • вам понадобится переменная для удерживания измененной английской части @EngTemp
  • переменная для хранения обрабатываемой подстроки @SubTemp
  • переменная для хранения оставшегося текста в строке, которая все еще нуждается в обработке @SubNext
  • переменная для хранения длины текущей подстроки @Len
  • выходная переменная @Out

Шаги:

  • Возьмите строковый ввод, поместите его в @SubNext в то время как PatIndex ('% [^ a-z]%', @SubNext) > 0
  • подстроку в хранилище индексов патча в @SubTemp, а также trim @SubNext для patindex
  • сохранить длину @SubTemp в @Len
  • если @Len > 1; set @Out = @Out + @EngTemp + @SubTemp; Set @EngTemp = '' (Этот шаг предполагает, что могут быть случаи, когда английская строка не является концом строки)
  • если @Len = 1; set @EngTemp = @SubTemp + @EngTemp
  • если @Len = 0; set @Out = @Out + @EngTemp (В этот момент цикл также должен закрыться)

Я собираюсь поиграть с этим, когда у меня есть время и опубликую фактический код, извините, если мои каракули не имеют никакого смысла

Ответ 3

Вы можете использовать функцию ASCII в SQL Server для получения значения ascii символов в текстовом поле в БД. Как только вы получите значение ascii, сравните его с допустимым диапазоном видимых символов и цифр на английском языке. Все остальное можно рассматривать как символ иврита.

Также существует функция REVERSE автоматически в SQL Server для изменения строки по мере необходимости.

В следующей ссылке есть пример кода.

http://www.sqlservercurry.com/2009/09/how-to-find-ascii-value-of-each.html