Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
Паша01
Member

Откуда:
Сообщений: 310
У меня есть таблица Template
CREATE TABLE Template (
  ID BIGINT, -- PK
  NAME NVARCHAR(255)
)


Поле NAME может содержать русский или английский текст. Я бы хотел переместить значение этого поля в новые поля RUSSIAN_NAME или ENGLISH_NAME в зависимости от того, что в поле NAME было записано.

CREATE TABLE Template (
  ID BIGINT, -- PK
  RUSSIAN_NAME NVARCHAR(255),
  ENGLISH_NAME NVARCHAR(255)
)
24 ноя 16, 12:30    [19929334]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Паша01,

напишите CLR функцию для разбора.
24 ноя 16, 12:42    [19929405]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
aleks2
Guest
Владислав Колосов
Паша01,

напишите CLR функцию для разбора.

Я бы написал табличку с русскими буквами и не парился. Можно даже шаблоном обойтись N'[а-яА-Я].

ЗЫ. А чо делать, если помесь испанского с нижегородским?
24 ноя 16, 12:57    [19929479]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
Sybex
Member

Откуда: Moscow
Сообщений: 119
Это разовая операция? А что делать если в поле содержится одновременно и русские и латинские буквы?

Вообще для разовой операции можно воспользоваться LIKE:
SELECT *
  FROM Template
 WHERE Template LIKE '%[А-ЯЁа-яё]%'
24 ноя 16, 12:58    [19929483]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
Паша01
Member

Откуда:
Сообщений: 310
Да, операция разовая. Спасибо за помощь!
SELECT *
  FROM Template
 WHERE name LIKE N'%[А-Яа-я]%'
24 ноя 16, 13:05    [19929514]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
aleks2
Можно даже шаблоном обойтись N'[а-яА-Я].
Лучше явно перечислить все буквы.
Диапазоны зависят от COLLATE
24 ноя 16, 13:41    [19929691]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
aleks2
Можно даже шаблоном обойтись N'[а-яА-Я].
Лучше явно перечислить все буквы.
Диапазоны зависят от COLLATE
Тем более, букв-то всего ничего - 66 штук!
24 ноя 16, 13:42    [19929695]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Британская латиница вроде бы COLLATE зависимости не подвержена?
24 ноя 16, 17:13    [19930939]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
Владислав Колосов
Британская латиница вроде бы COLLATE зависимости не подвержена?

И букв всего 28 х 2. Меньше "лайкать"...
24 ноя 16, 17:58    [19931117]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
Вот только нужно учесть, что в русских названиях фирм могут быть латинские символы. Причем вполне легально, типа "ООО Рога и Копыта XXI век" или "XX век Фокс"... и вот тут неожиданно потребуются regexp, CLR, случайный вызов демона...
24 ноя 16, 18:06    [19931146]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
o-o
Guest
[quot Руслан Дамировичтипа "ООО Рога и Копыта XXI век" или "XX век Фокс"[/quot]
наш человек Х набирает в русской раскладке
24 ноя 16, 18:11    [19931164]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
o-o
наш человек Х набирает в русской раскладке

А СИ как ЭС русское... И тут мы приходим к другой проблеме... Но не будем торопить события. Может у ТС база идеальная.
24 ноя 16, 18:15    [19931172]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
Паша01
Member

Откуда:
Сообщений: 310
Я же написал, что юзаю регулярку)
24 ноя 16, 20:02    [19931442]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
aleks2
Guest
Паша01
Я же написал, что юзаю регулярку)


Дарагуля, ты - ничтожно малая величина.
Если бы речь шла только о тебе - ваще никто бы не почесался.
25 ноя 16, 06:01    [19932376]     Ответить | Цитировать Сообщить модератору
 Re: Как определить, что в поле типа NVARCHAR содержатся латинские символы или кирилические  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
Родился тут с утра вот такой дикий анти-паттерн
CREATE TABLE #test(
  [text] NVARCHAR(500) )
;
INSERT 
INTO #test
VALUES
  ( 'ООО Рога и Копыта XXI век' ),
  ( 'XX век Фокс' ),
  ( 'XXX century FOX' ),
  ( 'Tesla Motors' ),
  ( '21 век' )
;
WITH
t ( [text], [i] ) AS (
  SELECT
    [text],
    [i] = LEN( [text] )
  FROM
    #test
  UNION ALL
  SELECT
    [text],
    [i] = [i] - 1
  FROM
    t
  WHERE
    t.[i] > 0
)
SELECT
  t.[text],
  [length] = MAX( [i] ),
  [latin] = SUM( ss.[is_latin] ),
  [cyrilic] = SUM( ss.[is_cyrilic] ),
  [numbers] = SUM( ss.[is_number] )
FROM
  t
  CROSS APPLY (
    SELECT
      [s] = SUBSTRING( t.[text], t.[i], 1 )
  ) t1
  CROSS APPLY (
    SELECT
      [is_latin] = CASE WHEN t1.[s] LIKE '[A-Za-z]' THEN 1 ELSE 0 END,
      [is_cyrilic] = CASE WHEN t1.[s] LIKE '[А-ЯЁа-яё]' THEN 1 ELSE 0 END,
      [is_number] = CASE WHEN t1.[s] LIKE '[0-9]' THEN 1 ELSE 0 END
  ) ss
GROUP BY
  t.[text]
25 ноя 16, 11:07    [19933015]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить