Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΏΡ€Π°Π²ΠΊΠ° ΠΏΠΎ SQLΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 10

Автор W Cat

name

Revenge

Royal Sovereign


ΠŸΠ°Ρ€Π½Π°Ρ ΠΊ LEFT функция RIGHT Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число символов справа ΠΈΠ· строкового выраТСния:


Π’ΠΎΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ€Π°Π±Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π±ΡƒΠΊΠ²Ρƒ:


SELECT name FROM Ships WHERE LEFT(name, 1) = RIGHT(name, 1)


Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ пустой Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΡ… ΠΊΠΎΡ€Π°Π±Π»Π΅ΠΉ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅Ρ‚. Π”Π°Π²Π°ΠΉΡ‚Π΅ возьмСм ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ - класс ΠΈ имя корабля.

Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… строковых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎ называСтся ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠ΅ΠΉ, ΠΈ Π² SQL Server для этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π½Π°ΠΊ "+" (Π² стандартС "||"). Π˜Ρ‚Π°ΠΊ,


SELECT * FROM (

SELECT class +' '+ name AS cn FROM Ships

) x

WHERE LEFT(cn, 1)=RIGHT(cn, 1)


Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ раздСляСм ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ имя класса ΠΈ имя корабля. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ всю ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ подзапрос. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄:

cn

Iowa Missouri

North Carolina Washington


А Ссли строковоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ лишь ΠΎΠ΄Π½Ρƒ Π±ΡƒΠΊΠ²Ρƒ? Запрос Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π΅Π΅. Π’ этом Π»Π΅Π³ΠΊΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, написав


SELECT * FROM (

SELECT class +' '+ name AS cn FROM Ships

UNION ALL

SELECT 'a' as nc

) x

WHERE LEFT(cn, 1)=RIGHT(cn, 1)


, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число символов Π² строкС. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠΌΡΡ случаСм, ΠΊΠΎΠ³Π΄Π° число символов большС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹:


SELECT * FROM (

SELECT class +' '+ name AS cn FROM Ships

UNION ALL

SELECT 'a' as nc

) x

WHERE LEFT(cn, 1)=RIGHT(cn, 1) AND LEN(cn)1


Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. РСализация этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² MS SQL Server ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΏΡ€ΠΈ подсчСтС Π΄Π»ΠΈΠ½Ρ‹ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ†Π΅Π²Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹.

Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:


DECLARE @chr AS CHAR(12), @vchr AS VARCHAR(12)


SELECT @chr = 'abcde' + REPLICATE(' ', 5), @vchr = 'abcde'+REPLICATE(' ', 5)


SELECT LEN(@chr), LEN(@vchr)

SELECT DATALENGTH(@chr), DATALENGTH(@vchr)


5

5

12

10



Ѐункция REPLICATE дополняСт константу 'abcde' ΠΏΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ справа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ LEN, - Π² ΠΎΠ±ΠΎΠΈΡ… случаях ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ 5.

Ѐункция DATALENGTH Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число Π±Π°ΠΉΡ‚ΠΎΠ² Π² прСдставлСнии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ дСмонстрируСт Π½Π°ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ CHAR ΠΈ VARCHAR. DATALENGTH даст Π½Π°ΠΌ 12 для Ρ‚ΠΈΠΏΠ° CHAR ΠΈ 10 - для VARCHAR.

Как ΠΈ слСдовало ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, DATALENGTH для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° VARCHAR Π²Π΅Ρ€Π½ΡƒΠ»Π° Ρ„Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Но ΠΏΠΎΡ‡Π΅ΠΌΡƒ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° CHAR Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ оказался Ρ€Π°Π²Π½Ρ‹ΠΌ 12? Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ CHAR - это Ρ‚ΠΈΠΏ фиксированной Π΄Π»ΠΈΠ½Ρ‹. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ оказываСтся мСньшС Π΅Π΅ Π΄Π»ΠΈΠ½Ρ‹, Π° Π΄Π»ΠΈΠ½Ρƒ ΠΌΡ‹ объявили ΠΊΠ°ΠΊ CHAR(12), Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ "Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½ΠΎ" Π΄ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ Π·Π° счСт добавлСния ΠΊΠΎΠ½Ρ†Π΅Π²Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ².

На сайтС ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π·Π°Π΄Π°Ρ‡ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… трСбуСтся ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ (Π½Π°ΠΉΡ‚ΠΈ максимум ΠΈ Ρ‚.Π΄.) Π² числовом порядкС значСния, прСдставлСнныС Π² тСкстовом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅. НапримСр, Π½ΠΎΠΌΠ΅Ρ€ мСста Π² самолСтС ("2d") ΠΈΠ»ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ CD ("24x"). ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ тСкст сортируСтся Ρ‚Π°ΠΊ (ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ)

11a

1a

2a


Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ,


SELECT '1a' AS place

UNION ALL SELECT '2a'

UNION ALL SELECT '11a'

ORDER BY 1


Если ΠΆΠ΅ трСбуСтся ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ мСста Π² порядкС возрастания рядов, Ρ‚ΠΎ порядок Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ

1a

2a

11a


Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΎΠ³ΠΎ порядка, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сортировку ΠΏΠΎ числовым значСниям, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π² тСкстС. МоТно ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ:

1. Π˜Π·Π²Π»Π΅Ρ‡ΡŒ число ΠΈΠ· строки.

2. ΠŸΡ€ΠΈΠ²Π΅ΡΡ‚ΠΈ Π΅Π³ΠΎ ΠΊ числовому Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ.

3. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сортировку ΠΏΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

Π’.ΠΊ. Π½Π°ΠΌ извСстно, Ρ‡Ρ‚ΠΎ Π±ΡƒΠΊΠ²Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π°, Ρ‚ΠΎ для извлСчСния числа ΠΈΠ· строки ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ конструкциСй, которая Π½Π΅ зависит ΠΎΡ‚ числа Ρ†ΠΈΡ„Ρ€ Π² Π½ΠΎΠΌΠ΅Ρ€Π΅ мСста:


LEFT(place, LEN(place)-1)


Если Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этим ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒΡΡ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ

place

1a

11a

2a


ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ числовому Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:


CAST (LEFT(place, LEN(place)-1) AS INT)


ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сортировку


SELECT * FROM (

SELECT '1a' AS place

UNION ALL SELECT '2a'

UNION ALL SELECT '11a'

) x

ORDER BY CAST(LEFT(place, LEN(place)-1) AS INT)


Π§Ρ‚ΠΎ ΠΈ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ.

Π Π°Π½Π΅Π΅ ΠΌΡ‹ для извлСчСния числа ΠΈΠ· тСкстовой строки пользовались Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ LEFT, Ρ‚.ΠΊ. Π½Π°ΠΌ Π±Ρ‹Π»ΠΎ извСстно Π°ΠΏΡ€ΠΈΠΎΡ€ΠΈ, ΠΊΠ°ΠΊΠΎΠ΅ число символов Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ справа (ΠΎΠ΄ΠΈΠ½). А Ссли ΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ строку ΠΈΠ· подстроки Π½Π΅ ΠΏΠΎ извСстной ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ символа, Π° ΠΏΠΎ самому символу? НапримСр: ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ всС символы Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ "Ρ…" (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ скорости CD).

Π’ этом случаС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΆΠ΅ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½Π½ΡƒΡŽ Ρ€Π°Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CHARINDEX, которая ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅ΠΈΠ·Π²Π΅ΡΡ‚Π½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ символа:


SELECT model, LEFT(cd, CHARINDEX('x', cd) -1) FROM PC


Ѐункция SUBSTRING


SUBSTRING (<Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, <Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ позиция, <Π΄Π»ΠΈΠ½Π° )

Π­Ρ‚Π° функция позволяСт ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· выраТСния Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, начиная ΠΎΡ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ символьной ΠΈΠ»ΠΈ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ строкой, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ text ΠΈΠ»ΠΈ image. НапримСр, Ссли Π½Π°ΠΌ потрСбуСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ 3 символа Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ корабля, начиная со 2-Π³ΠΎ символа, Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±Π΅Π· ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SUBSTRING Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ просто. А Ρ‚Π°ΠΊ ΠΌΡ‹ пишСм:


SELECT name, SUBSTRING(name, 2, 3) FROM Ships


Π’ случаС, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ всС символы, начиная с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ, ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. НапримСр,


SELECT name, SUBSTRING(name, 2, LEN(name)) FROM Ships


даст Π½Π°ΠΌ всС символы Π² названиях ΠΊΠΎΡ€Π°Π±Π»Π΅ΠΉ ΠΎΡ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ Π² ΠΈΠΌΠ΅Π½ΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ для указания числа ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌΡ‹Ρ… символов я использовал Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ LEN(name), которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число символов Π² ΠΈΠΌΠ΅Π½ΠΈ. ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½Ρ‹ символы, начиная со Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ, Ρ‚ΠΎ ΠΈΡ… число Π±ΡƒΠ΄Π΅Ρ‚ мСньшС ΠΎΠ±Ρ‰Π΅Π³ΠΎ количСства символов Π² ΠΈΠΌΠ΅Π½ΠΈ. Однако это Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ошибки, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ссли ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ число символов ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ число, Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Ρ‹ всС символы Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° строки. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ я ΠΈ Π±Π΅Ρ€Ρƒ ΠΈΡ… с запасом, Π½Π΅ утруТдая сСбя вычислСниями.

Ѐункция REVERSE


Π­Ρ‚Π° функция ΠΏΠ΅Ρ€Π΅Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ строку, ΠΊΠ°ΠΊ Π±Ρ‹ читая Π΅Π΅ справа Π½Π°Π»Π΅Π²ΠΎ. Π’.Π΅. Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ запроса


SELECT REVERSE('abcdef')


Π±ΡƒΠ΄Π΅Ρ‚ 'fedcba'. Если Π±Ρ‹ Π² языкС отсутствовала функция RIGHT, Ρ‚ΠΎ запрос


SELECT RIGHT('abcdef',3)


ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π°Π²Π½ΠΎΡΠΈΠ»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ запросом


SELECT REVERSE(LEFT(REVERSE('abcdef'),3))


Π― Π²ΠΈΠΆΡƒ ΠΏΠΎΠ»ΡŒΠ·Ρƒ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ. ΠŸΡƒΡΡ‚ΡŒ Π½Π°ΠΌ трСбуСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π½Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ, Π° послСднСго вхоТдСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ символа (ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов) Π² строкС. Вспомним ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ опрСдСляли ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ символа "Π°" Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ корабля "California":


SELECT CHARINDEX('a', name) first_a

FROM Ships WHERE name='California'


ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ послСднСго вхоТдСния Π² это Π½Π°Π·Π²Π°Π½ΠΈΠ΅ символа "Π°". Ѐункция


CHARINDEX('a', REVERSE(name))


ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΉΡ‚ΠΈ эту ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π½ΠΎ справа. Для получСния ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ этого ΠΆΠ΅ символа слСва достаточно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ


SELECT LEN(name) + 1 - CHARINDEX('a', REVERSE(name)) first_a

FROM Ships WHERE name='California'


Ѐункция REPLACE


REPLACE ( <строка1 , <строка2 , <строка3 )

ЗамСняСт Π² строкС1 всС вхоТдСния строки2 Π½Π° строку3. Π­Ρ‚Π° функция, бСзусловно, ΠΏΠΎΠ»Π΅Π·Π½Π° Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… обновлСния (UPDATE), Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ (ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ) содСрТимоС столбца. ΠŸΡƒΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ дСфисом Π² названиях ΠΊΠΎΡ€Π°Π±Π»Π΅ΠΉ. Π’ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ


UPDATE Ships

SET name = REPLACE(name, ' ', '-')


(Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π° страницС с упраТнСниями DML, Π³Π΄Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ запросы Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…)

Однако эта функция ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈ Π² Π±ΠΎΠ»Π΅Π΅ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… случаях. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ, сколько Ρ€Π°Π· Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ корабля ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΡƒΠΊΠ²Π° "a". ИдСя проста: Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΡΠΊΠΎΠΌΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ двумя Π»ΡŽΠ±Ρ‹ΠΌΠΈ символами, послС Ρ‡Π΅Π³ΠΎ посчитаСм Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ Π΄Π»ΠΈΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΈ искомой строки. Π˜Ρ‚Π°ΠΊ,


SELECT name, LEN(REPLACE(name, 'a', 'aa')) - LEN(name) FROM Ships


А Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ число Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов, скаТСм, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² Ρ…Ρ€Π°Π½ΠΈΠΌΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ? Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π² этом случаС слСдуСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π° число символов Π² искомой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:


DECLARE @str AS VARCHAR(100)

SET @str='ma'

SELECT name, (LEN(REPLACE(name, @str, @str + @str)) - LEN(name))/LEN(@str) FROM Ships


Для удвоСния числа искомых символов здСсь ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»Π°ΡΡŒ конкатСнация - @str + @str . Однако для этой Ρ†Π΅Π»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ - REPLICATE, которая повторяСт ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚Π°ΠΊΠΎΠ΅ число Ρ€Π°Π·, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ задаСтся Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ.