Обратные символы в строке со смешанными левыми и правыми языками с использованием языка 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