Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Чувствительность к регистру (функция replace) / 22 сообщений из 22, страница 1 из 1
20.12.2002, 16:05
    #32082484
Чувствительность к регистру (функция replace)
Проблема в том, что в поле name таблицы закачаны строки, содержащие некоторые(не все) символы в неправильной кодировке в верхнем и нижнем регистре. можно поменять их функцией replace. В результате меняет символы и в нижнем и в верхнем регистрах. Как сделать замену регистрочувствительной?
...
Рейтинг: 0 / 0
20.12.2002, 16:11
    #32082487
Trong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
Проще всего, наверное, свою функцию написать ...
...
Рейтинг: 0 / 0
20.12.2002, 17:58
    #32082562
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
Для 7, пожалуй примерно так

Код: plaintext
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.
set nocount on
declare @s varchar( 20 ),
@b varbinary( 20 ), 
@b11 binary( 1 ), @b12 binary( 1 ),
@b21 binary( 1 ), @b22 binary( 1 )

set @s='AAAaaaCCCccc'
set @b=convert(varbinary( 20 ),@s)

set @b11=convert(varbinary( 1 ),'a')
set @b12=convert(varbinary( 1 ),'b')

set @b21=convert(varbinary( 1 ),'c')
set @b22=convert(varbinary( 1 ),'d')

declare @i int 
set @i= 1 

while @i<=len(@s)
begin
select  @b= 
	case when substring(@b,@i, 1 )=@b11 
		then convert(varbinary( 20 ),stuff(@b,@i, 1 ,@b12)) else 
	case when substring(@b,@i, 1 )=@b21 
		then convert(varbinary( 20 ),stuff(@b,@i, 1 ,@b22)) else 
	@b end end

set @i=@i+ 1 
end

set @s=convert(varchar( 20 ),@b)

select @s
...
Рейтинг: 0 / 0
20.12.2002, 18:14
    #32082572
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
REPLACE чувствительна к регистру.
При условии, что аргумент (поле name) имеет case-sensitive collation.
...
Рейтинг: 0 / 0
21.12.2002, 13:42
    #32082681
Александр Степанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
Если версия сервера 2000, то можно воспользоваться COLLATE, например (коллейшн базы по умолчанию - Latin1_General_CI_AS):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE @field nvarchar( 100 ), @what nvarchar( 100 ), @to nvarchar( 100 )

Set @field='A StRiNg'
Set @what='string'
Set @to='XXXXXX'

Select
	replace(@field,@what,@to),
	replace(@field collate Latin1_General_CS_AS,@what collate Latin1_General_CS_AS,@to)
...
Рейтинг: 0 / 0
21.12.2002, 15:05
    #32082695
Fil
Fil
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
declare @up varchar( 80 )
set @up='ASerTYUhjk'

select upper(@up)

set @up='ASerTYUhjk'

select lower(@up)


результат:

1.ASERTYUHJK

2.asertyuhjk
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
05.08.2019, 15:48
    #39845441
Чувствительность к регистру (функция replace)
Cat2, здравствуйте!

Тоже возникла такая задача, но на MS SQL Server 2017. Ваш скрипт подойдёт? Или может там уже придумали регистрочувствительные функции подмены?
...
Рейтинг: 0 / 0
05.08.2019, 15:52
    #39845443
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
Борис ГаркунCat2, здравствуйте!

Тоже возникла такая задача, но на MS SQL Server 2017. Ваш скрипт подойдёт? Или может там уже придумали регистрочувствительные функции подмены?
Чем вам вариант с collate не нравится?
...
Рейтинг: 0 / 0
05.08.2019, 15:59
    #39845448
Чувствительность к регистру (функция replace)
Minamoto,

потому что вызов
Код: sql
1.
replace('h' collate Latin1_General_CS_AS, 'h' collate Latin1_General_CS_AS, 'н')


почему-то возвращает ?
...
Рейтинг: 0 / 0
05.08.2019, 16:31
    #39845457
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
Борис ГаркунMinamoto,

потому что вызов
Код: sql
1.
replace('h' collate Latin1_General_CS_AS, 'h' collate Latin1_General_CS_AS, 'н')



почему-то возвращает ?1. Cat2 здесь вряд ли появится.
2. У вас юникод (nvarchar)?
...
Рейтинг: 0 / 0
05.08.2019, 17:02
    #39845472
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
Борис ГаркунMinamoto,

потому что вызов
Код: sql
1.
replace('h' collate Latin1_General_CS_AS, 'h' collate Latin1_General_CS_AS, 'н')


почему-то возвращает ?

Потому что (как правильно выше написал iap)

Код: sql
1.
select replace(N'h' collate Latin1_General_CS_AS, N'h' collate Latin1_General_CS_AS, N'н')
...
Рейтинг: 0 / 0
06.08.2019, 09:19
    #39845669
Чувствительность к регистру (функция replace)
Minamoto и iap, спасибо. Приставка N указывает программе, что на входе nvarchar?
...
Рейтинг: 0 / 0
06.08.2019, 09:34
    #39845678
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
Борис ГаркунMinamoto и iap, спасибо. Приставка N указывает программе, что на входе nvarchar? FAQ
...
Рейтинг: 0 / 0
06.08.2019, 10:09
    #39845702
Чувствительность к регистру (функция replace)
iap, спасибо. Получается с помощью N мы задаем default collation и одновременно допиской collate Latin1_General_CS_AS устанавливаем еще один collation. Зачем, кто из них побудит? :)
...
Рейтинг: 0 / 0
06.08.2019, 10:10
    #39845703
Чувствительность к регистру (функция replace)
*победит
...
Рейтинг: 0 / 0
06.08.2019, 10:17
    #39845708
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
Борис Гаркунiap, спасибо. Получается с помощью N мы задаем default collation и одновременно допиской collate Latin1_General_CS_AS устанавливаем еще один collation. Зачем, кто из них побудит? :)При чём здесь collation?
Если пишем литеральную строку, то встаёт вопрос: а какого она типа?
Чтобы избежать преобразование по умолчанию, когда имеем в виду юникодную строку,
пишем перед ней букву N, и сервер в момент чтения этой строки знает, что это - юникод.
Преобразование по умолчанию происходит не всегда корректно.
Символы юникода в MSSQL двухбайтные в отличие от строк ASCII.
Два байта на символ и один байт на символ - есть разница?
...
Рейтинг: 0 / 0
06.08.2019, 10:21
    #39845710
Чувствительность к регистру (функция replace)
iap, спасибо. А дописка collate Latin1_General_CS_AS для чего?
...
Рейтинг: 0 / 0
06.08.2019, 10:34
    #39845718
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
Борис Гаркунiap, спасибо. А дописка collate Latin1_General_CS_AS для чего?
Чтобы указать параметры сравнения строк, а конкретно - Case Sensitive (CS в названии).
...
Рейтинг: 0 / 0
06.08.2019, 11:18
    #39845757
Чувствительность к регистру (функция replace)
Minamoto, спасибо!
...
Рейтинг: 0 / 0
15.08.2019, 10:59
    #39849633
Чувствительность к регистру (функция replace)
Здравствуйте!

Попробовал применить совет на практике:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT 
	p.C_Name1
	, replace(Np.C_Name1 collate Latin1_General_CS_AS, Np.C_Name1 collate Latin1_General_CS_AS, N'н')
	, S.B_EE
FROM dbo.ED_Registr_Pts RP
JOIN dbo.SD_Subscr S -- ЛС
	ON S.F_Division	= RP.F_Division AND S.LINK = RP.F_Subscr
JOIN dbo.CD_Partners P -- Контрагент
	ON P.LINK = S.F_Partners
JOIN SV_Divisions d
	ON d.link = p.F_Division
WHERE
	p.C_Name1 LIKE '%h%'
	AND S.B_EE = 0


Возвращает ошибку вида "Не удалось привязать составной идентификатор "Np.C_Name1""
Если же N с пробелом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT 
	d.C_name
	, p.C_Name1
	, replace(N p.C_Name1 collate Latin1_General_CS_AS, N p.C_Name1 collate Latin1_General_CS_AS, N'н')
	, S.B_EE
FROM dbo.ED_Registr_Pts RP
JOIN dbo.SD_Subscr S	-- ЛС
		ON S.F_Division	= RP.F_Division AND S.LINK = RP.F_Subscr
JOIN dbo.CD_Partners P -- Контрагент
		ON P.LINK = S.F_Partners
JOIN SV_Divisions d
	ON d.link = p.F_Division
WHERE
	p.C_Name1 LIKE '%h%'
	AND S.B_EE = 0


то ошибка "Неправильный синтаксис около конструкции "p"."
Скажите, пожалуйста, как правильно применить ссылку на юникод(N)?
...
Рейтинг: 0 / 0
15.08.2019, 11:23
    #39849652
Guf
Guf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
Борис Гаркун,

Код: sql
1.
	, replace(p.C_Name1 collate Latin1_General_CS_AS, p.C_Name1 collate Latin1_General_CS_AS, N'н')


"N" нужен только у строковых констант, во всех остальных случаях он не нужен.
Одна из красных единиц, видимо, лишняя
...
Рейтинг: 0 / 0
15.08.2019, 11:24
    #39849653
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чувствительность к регистру (функция replace)
Борис ГаркунЗдравствуйте!

Попробовал применить совет на практике:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT 
	p.C_Name1
	, replace(Np.C_Name1 collate Latin1_General_CS_AS, Np.C_Name1 collate Latin1_General_CS_AS, N'н')
	, S.B_EE
FROM dbo.ED_Registr_Pts RP
JOIN dbo.SD_Subscr S -- ЛС
	ON S.F_Division	= RP.F_Division AND S.LINK = RP.F_Subscr
JOIN dbo.CD_Partners P -- Контрагент
	ON P.LINK = S.F_Partners
JOIN SV_Divisions d
	ON d.link = p.F_Division
WHERE
	p.C_Name1 LIKE '%h%'
	AND S.B_EE = 0


Возвращает ошибку вида "Не удалось привязать составной идентификатор "Np.C_Name1""
Если же N с пробелом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT 
	d.C_name
	, p.C_Name1
	, replace(N p.C_Name1 collate Latin1_General_CS_AS, N p.C_Name1 collate Latin1_General_CS_AS, N'н')
	, S.B_EE
FROM dbo.ED_Registr_Pts RP
JOIN dbo.SD_Subscr S	-- ЛС
		ON S.F_Division	= RP.F_Division AND S.LINK = RP.F_Subscr
JOIN dbo.CD_Partners P -- Контрагент
		ON P.LINK = S.F_Partners
JOIN SV_Divisions d
	ON d.link = p.F_Division
WHERE
	p.C_Name1 LIKE '%h%'
	AND S.B_EE = 0


то ошибка "Неправильный синтаксис около конструкции "p"."
Скажите, пожалуйста, как правильно применить ссылку на юникод(N)?N - это для строчных литералов.

Для приведения поля к юникоду надо использовать CAST или CONVERT:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT 
	p.C_Name1
	, replace(Np.C_Name1 collate Latin1_General_CS_AS, CAST(p.C_Name1 as nvarchar(max)) collate Latin1_General_CS_AS, N'н')
	, S.B_EE
FROM dbo.ED_Registr_Pts RP
JOIN dbo.SD_Subscr S -- ЛС
	ON S.F_Division	= RP.F_Division AND S.LINK = RP.F_Subscr
JOIN dbo.CD_Partners P -- Контрагент
	ON P.LINK = S.F_Partners
JOIN SV_Divisions d
	ON d.link = p.F_Division
WHERE
	p.C_Name1 LIKE '%h%'
	AND S.B_EE = 0
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Чувствительность к регистру (функция replace) / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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