Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / транскрипция в SELECT / 18 сообщений из 18, страница 1 из 1
03.04.2013, 10:33:38
    #38210492
andrew_jr20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
Добрый день.
Возникла необходимость транскрибировать часть поля при запросе, а с какой стороны подойти к этому вопросу, чтобы было как можно менее затратно - ума не приложу. Поясню на примере:
есть текстовое поле Name в таблице names, значения которого такого вида: 15нл, 123жд, 900ф... До вчерашнего дня использовался такой запрос:
Select n.name from names n where....
Результатом было, естественно, значение поля без изменений. А вчера возникла необходимость кроме простого выдёргивания получать ещё и транскрибированные значения этого поля, т.е. чтобы вместо озвученных значений были вот такие: 15nl, 123zhd, 900f. Как этого достичь малой кровью? Была мысль создать таблицу транскрибирования (a=а, б=b, ... я=ya) - но как внутри запроса побуквенно выдёргивать это всё?
Заранее спасибо!
...
Рейтинг: 0 / 0
03.04.2013, 10:48:51
    #38210536
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
andrew_jr20но как внутри запроса побуквенно выдёргивать это всё?Написать свою функцию транскрибирования, потом
andrew_jr20Select n.name, transcribe(n.name) as name_t from names n where....
...
Рейтинг: 0 / 0
03.04.2013, 13:51:33
    #38211075
andrew_jr20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
tanglirandrew_jr20но как внутри запроса побуквенно выдёргивать это всё?Написать свою функцию транскрибирования, потом
andrew_jr20Select n.name, transcribe(n.name) as name_t from names n where....
Спасибо - получается, что я ошибся немного в формулировке, поискал примеры функции "транслитерирования", и нашёл как раз то, что нужно :)
...
Рейтинг: 0 / 0
03.04.2013, 14:50:31
    #38211210
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
andrew_jr20,

Интересно: нашли транслитерацию силами Мускуля или на клиенте?

А то я как раз вчера сделал запросом с разбором строки на символы и свертку обратной группировкой. :)
...
Рейтинг: 0 / 0
03.04.2013, 15:26:53
    #38211334
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
Arhat109сделал запросом с разбором строки на символы и свертку обратной группировкой
В соответствии с ГОСТ 7.79-2001? так выложил бы код - на FAQ тянет...
...
Рейтинг: 0 / 0
03.04.2013, 16:59:13
    #38211574
andrew_jr20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
Arhat109andrew_jr20,

Интересно: нашли транслитерацию силами Мускуля или на клиенте?

А то я как раз вчера сделал запросом с разбором строки на символы и свертку обратной группировкой. :)

Мускулем, вот тут взял пример (2 способ), и напильничком прошёлся, чтобы под мои нужды подошло.
...
Рейтинг: 0 / 0
04.04.2013, 07:14:46
    #38212114
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
Akina,

пока не могу... через полгода не раньше. :)
...
Рейтинг: 0 / 0
04.04.2013, 07:25:06
    #38212118
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
Akina,

да, и не знаю насчет "в соответствии"... у нас была транслитерация на клиенте... а мне понадобилось доливать данные запросом в табличку... ну вот и "воспроизвел" ту, которая была... за полчасика. :)

Похоливарить:
Решения на циклах в SQL - мне вообще не нравятся... это как костыль в Реляционной Алгебре для "хромоногих" (спецов от ЯП). Причем, в ЯП - это нормально и приветсвуется, как ни странно. :)
...
Рейтинг: 0 / 0
04.04.2013, 08:05:24
    #38212144
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
Arhat109Решения на циклах в SQL - мне вообще не нравятсяТак и задача не скл-ная, в общем-то.
...
Рейтинг: 0 / 0
04.04.2013, 08:13:35
    #38212154
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
tanglir,

Ну не совсем скульная, конечно... да, в общем-то извращение это всё. Такие задачи надо решать на клиенте. Проще, дещевле и быстрее.
...
Рейтинг: 0 / 0
04.04.2013, 09:04:50
    #38212187
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
Ну в рамках мускуля можно и UDF нарисовать. Задача-то - почти чистый XLAT...
...
Рейтинг: 0 / 0
04.04.2013, 10:06:34
    #38212288
andrew_jr20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
Arhat109Akina,

Похоливарить:
Решения на циклах в SQL - мне вообще не нравятся... это как костыль в Реляционной Алгебре для "хромоногих" (спецов от ЯП). Причем, в ЯП - это нормально и приветсвуется, как ни странно. :)

:) Оно и понятно, что почти все варианты только костылями и получится воспроизвести, и цикл - один из таких костылей, который по быстродействию да по накладным расходам, я так думаю, будет всё-таки быстрее, чем по каждому чиху по таблицам лазить - тут на входе строка, внутри эта строка гоняется в цикле (больше нигде не нашёл варианта, чтобы без цикла можно было обойтись), на выходе строка, "при съёмках фильма ни одна таблица не пострадала"
...
Рейтинг: 0 / 0
04.04.2013, 12:10:07
    #38212562
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
andrew_jr20, а похоливарим (три дня убил на пустую задачу, блин). :)

дело в том, что tanglir - прав. Эта задача не совсем для Скуля и РА.
По-хорошему, она должна решаться на клиенте силами ЯП... но иногда надо, да и лепить разовую обработку на ЯП для уже имеющейся БД иногда просто "лениво"... :)

В РА - любые решения на явных циклах - свисток в сторону "косяк". По одной простой причине: РА - это набор операций над множеством данных. То есть "по определению" - циклическая обработка, которая прошита непосредственно в базовых операциях. В частности, при реализациях на каких-нибудь не Фон Неймановских архитектурах, понятие "цикл" может совсем отсутствовать. И это - нормально для реляционной алгебры в целом. Все решения циклами (и ХП в т.ч.) в этом случае - отдыхают.

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

как итог: ЯП и Скуль - это два совершенно разных подхода к обработке данных. "То что русскому хорошо, немцу - смерть" - как нельзя применимо. :)
...
Рейтинг: 0 / 0
04.04.2013, 12:13:05
    #38212574
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
Akina,

по-хорошему, да. Неплохо бы иметь расширенный набор встроенных функций обработки текстовых строк, в т.ч. и XLAT(). Тут много чего не хватает... увы. :(
...
Рейтинг: 0 / 0
04.04.2013, 13:04:21
    #38212708
andrew_jr20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
Arhat109andrew_jr20, а похоливарим (три дня убил на пустую задачу, блин). :)

дело в том, что tanglir - прав. Эта задача не совсем для Скуля и РА.
По-хорошему, она должна решаться на клиенте силами ЯП... но иногда надо, да и лепить разовую обработку на ЯП для уже имеющейся БД иногда просто "лениво"... :)

В РА - любые решения на явных циклах - свисток в сторону "косяк". По одной простой причине: РА - это набор операций над множеством данных. То есть "по определению" - циклическая обработка, которая прошита непосредственно в базовых операциях. В частности, при реализациях на каких-нибудь не Фон Неймановских архитектурах, понятие "цикл" может совсем отсутствовать. И это - нормально для реляционной алгебры в целом. Все решения циклами (и ХП в т.ч.) в этом случае - отдыхают.

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

как итог: ЯП и Скуль - это два совершенно разных подхода к обработке данных. "То что русскому хорошо, немцу - смерть" - как нельзя применимо. :)

Ну про смерть-то уж загнули! :) Не настолько же там всё "плохо". Тем более всегда всё зависит от конкретной ситуации: например, в моём случае есть 2 нюанса: 1 - циклы будут в 2-4 шага (очень короткие входные строки - никогда не будет на входе 50-100-символьных параметров, которые заставят по каждому запросу колотить эту цикличность), 2 - клиент, который будет это всё запрашивать, мне неизвестен - может там php, может perl,а может что-то настолько низкоуровневое, что может только отсылать запросы, получать набор данных и пересылать их дальше - я без понятия, но перекладывать то, о чём меня попросил заказчик, на него обратно, я просто не могу - поэтому пришлось взвалить всё именно на сервер, и уже на нём выбирать - какой способ предпочтительнее :)
...
Рейтинг: 0 / 0
04.04.2013, 14:02:38
    #38212864
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
andrew_jr20,

1. выбирать "как есть" и отдавать на клиента. Там сами разберутся.
2. вот и меня "Заказчик попросил"... :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.04.2014, 14:18:51
    #38619485
aMacedonian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
DELIMITER $$

DROP FUNCTION IF EXISTS `_fs_transliterate_ru` $$
CREATE DEFINER=`root`@`localhost`
  FUNCTION `_fs_transliterate_ru`(str TEXT)
  RETURNS text CHARSET utf8
DETERMINISTIC SQL SECURITY INVOKER
BEGIN
  DECLARE strlow TEXT;
  DECLARE sub VARCHAR(3);
  DECLARE res TEXT;
  DECLARE len INT(11);
  DECLARE i INT(11);
  DECLARE pos INT(11);
  DECLARE alphabeth CHAR(34);

  SET i = 0;
  SET res = '';
  SET strlow = LOWER(str);
  SET len = LENGTH(str); 
  SET alphabeth = ' абвгдеёжзийклмнопрстуфхцчшщъыьэюя';

  /* идем циклом по символам строки */

  WHILE i <= len DO

  SET i = i + 1;
  SET pos = INSTR(alphabeth, SUBSTR(strlow,i,1));

  /*выполняем преобразование припомощи ф-ии ELT */

  SET sub = elt(pos, '-',
  'a','b','v','g', 'd', 'e', 'e','zh', 'z',
  'i','j','k','l', 'm', 'n', 'o', 'p', 'r',
  's','t','u','f', 'h', 'c','ch','sh','sch',
  '', 'y', '','e','ju','ja');

  IF sub IS NULL THEN
  SET sub = '';
  END IF;

  SET res = CONCAT(res, sub);
  END WHILE;

  RETURN res;
END $$

DELIMITER ;
...
Рейтинг: 0 / 0
19.04.2014, 14:27:53
    #38619489
aMacedonian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транскрипция в SELECT
Потом вызов:
Код: plsql
1.
SELECT _fs_transliterate_ru(`caption`) FROM ... LIMIT 1
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / транскрипция в SELECT / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]