Когда Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² 1Π‘:ΠŸΡ€Π΅Π΄ΠΏΡ€ΠΈΡΡ‚ΠΈΠ΅, часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ситуация, ΠΊΠΎΠ³Π΄Π° строковыС поля содСрТат числовыС значСния β€” Π°Ρ€Ρ‚ΠΈΠΊΡƒΠ»Ρ‹, Π½ΠΎΠΌΠ΅Ρ€Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΠ΄Ρ‹ Π½ΠΎΠΌΠ΅Π½ΠΊΠ»Π°Ρ‚ΡƒΡ€Ρ‹ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ просто числа, записанныС ΠΊΠ°ΠΊ тСкст. Бтандартная сортировка Ρ‚Π°ΠΊΠΈΡ… строк ΠΏΠΎ Π°Π»Ρ„Π°Π²ΠΈΡ‚Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ абсурдным Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ: вмСсто ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ 1, 2, 10, 20 Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ 1, 10, 2, 20. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° особСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π° ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с внСшними источниками Π΄Π°Π½Π½Ρ‹Ρ…, Π³Π΄Π΅ числовыС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ хранятся Π² тСкстовом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ способы ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ сортировки строк ΠΊΠ°ΠΊ чисСл Π² 1Π‘ 8.3 ΠΈ 8.2 β€” ΠΎΡ‚ простых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΄ΠΎ слоТных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ограничСния ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… ошибок ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… массивов Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΊΠ°ΠΊ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ, Ρ‚Π°ΠΊ ΠΈ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΌ программистам, ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ²ΡˆΠΈΠΌΡΡ с Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌΠΈ нюансами сортировки.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ стандартная сортировка строк Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с числами

ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° 1Π‘:ΠŸΡ€Π΅Π΄ΠΏΡ€ΠΈΡΡ‚ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ лСксикографичСский порядок для сортировки строковых Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сравнСниС происходит посимвольно слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ ΠΊΠΎΠ΄ΠΎΠ² символов Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Unicode. Для чисСл, записанных ΠΊΠ°ΠΊ строки, это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ:

  • πŸ”’ ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ порядок ΠΌΠ½ΠΎΠ³ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹Ρ… чисСл: строка "100" Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ "20", ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ символ '1' ΠΈΠΌΠ΅Π΅Ρ‚ мСньший ΠΊΠΎΠ΄, Ρ‡Π΅ΠΌ '2'.
  • πŸ“‰ Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π΅Π΄ΡƒΡ‰ΠΈΡ… Π½ΡƒΠ»Π΅ΠΉ: строки "001" ΠΈ "1" ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈ простом сравнСнии, Π½ΠΎ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ.
  • 🌍 Π—Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ Π»ΠΎΠΊΠ°Π»ΠΈ: Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языковых настройках символы ',' ΠΈ '.' (Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ тысяч ΠΈ дСсятичных) ΠΌΠΎΠ³ΡƒΡ‚ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° порядок.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠΉ сортировки Π² запросС:

ВЫБРАВЬ

НомСнклатура.Артикул КАК Артикул

Π˜Π—

Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ.НомСнклатура КАК НомСнклатура

Π£ΠŸΠžΠ Π―Π”ΠžΠ§Π˜Π’Π¬ ПО

Артикул

Для Π°Ρ€Ρ‚ΠΈΠΊΡƒΠ»ΠΎΠ² "10", "100", "2", "200" Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚: 10, 100, 2, 200 β€” Ρ‡Ρ‚ΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ для бизнСс-Π·Π°Π΄Π°Ρ‡.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… конфигурациях (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 1Π‘:ERP ΠΈΠ»ΠΈ 1Π‘:Π£Π’) Π°Ρ€Ρ‚ΠΈΠΊΡƒΠ»Ρ‹ Π½ΠΎΠΌΠ΅Π½ΠΊΠ»Π°Ρ‚ΡƒΡ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ строки Π΄Π»ΠΈΠ½ΠΎΠΉ Π΄ΠΎ 50 символов. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² числа Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ошибкС пСрСполнСния, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 2^31-1.

ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ строк Π² числа

Π‘Π°ΠΌΡ‹ΠΉ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ способ β€” явноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ строковых Π΄Π°Π½Π½Ρ‹Ρ… Π² числовой Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅Π΄ сортировкой. Π’ 1Π‘ для этого Π΅ΡΡ‚ΡŒ нСсколько встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

  • πŸ”„ Число() β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ функция прСобразования строки Π² число. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Число("123.45") Π²Π΅Ρ€Π½Ρ‘Ρ‚ 123.45.
  • πŸ“Š Π’Π°Π»() β€” Π°Π½Π°Π»ΠΎΠ³ Число(), Π½ΠΎ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ Ρ€Π΅Π³ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… настроСк (Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ тысяч ΠΈ дСсятичных).
  • πŸ”’ Π¦Π΅Π»() β€” ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Ρ†Π΅Π»ΠΎΠ΅ число (отбрасываСт Π΄Ρ€ΠΎΠ±Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² запросС:

ВЫБРАВЬ

НомСнклатура.Артикул КАК Артикул,

Число(НомСнклатура.Артикул) КАК АртикулЧисло

Π˜Π—

Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ.НомСнклатура КАК НомСнклатура

Π£ΠŸΠžΠ Π―Π”ΠžΠ§Π˜Π’Π¬ ПО

АртикулЧисло

Однако этот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ критичСскиС ограничСния:

  1. НС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со строками, содСрТащими нСчисловыС символы (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Ρ€Ρ‚ΠΈΠΊΡƒΠ»Ρ‹ Π²ΠΈΠ΄Π° "ABC-123").
  2. Π’Ρ‹Π΄Π°Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли строка пустая ΠΈΠ»ΠΈ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹.
  3. МСдлСнно выполняСтся Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π²Ρ‹Π±ΠΎΡ€ΠΊΠ°Ρ… (ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки Π² число Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ рСсурсов).
πŸ’‘

Для ускорСния сортировки Π±ΠΎΠ»ΡŒΡˆΠΈΡ… массивов Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ значСниями, Π° Π·Π°Ρ‚Π΅ΠΌ сортируйтС Π΅Ρ‘.

ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ: сортировка Π±Π΅Π· прСобразования Ρ‚ΠΈΠΏΠΎΠ²

Если ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ строк Π² числа Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·-Π·Π° наличия Π±ΡƒΠΊΠ² Π² Π°Ρ€Ρ‚ΠΈΠΊΡƒΠ»Π°Ρ…), ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹:

1. Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ строк Π²Π΅Π΄ΡƒΡ‰ΠΈΠΌΠΈ нулями

ИдСя ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: привСсти всС строки ΠΊ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Π΅, Π΄ΠΎΠ±Π°Π²ΠΈΠ² слСва Π½ΡƒΠ»ΠΈ. НапримСр, "2" станСт "002", Π° "100" β€” "100". ПослС этого лСксикографичСская сортировка Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с числовой.

РСализация Π½Π° встроСнном языкС:

Ѐункция Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΠΡƒΠ»ΡΠΌΠΈ(Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π”Π»ΠΈΠ½Π° = 10) Экспорт

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ = Π‘Ρ‚Ρ€Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ(Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, " ", "");

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Π›Π΅Π²(Π‘Ρ‚Ρ€ΠΎΠΊΠ°(ΠŸΠΎΠ²Ρ‚ΠΎΡ€(0, Π”Π»ΠΈΠ½Π°)) + Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π”Π»ΠΈΠ½Π°);

ΠšΠΎΠ½Π΅Ρ†Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² запросС:

ВЫБРАВЬ

НомСнклатура.Артикул КАК Артикул,

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΠΡƒΠ»ΡΠΌΠΈ(НомСнклатура.Артикул, 20) КАК АртикулДляБортировки

Π˜Π—

Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ.НомСнклатура КАК НомСнклатура

Π£ΠŸΠžΠ Π―Π”ΠžΠ§Π˜Π’Π¬ ПО

АртикулДляБортировки

2. ИспользованиС рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ для извлСчСния чисСл

Если строка содСрТит ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "ART-0042"), ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Ρ‡ΠΈΡΠ»ΠΎΠ²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ Π½Π΅ΠΉ:

Ѐункция Π˜Π·Π²Π»Π΅Ρ‡ΡŒΠ§ΠΈΡΠ»ΠΎΠ˜Π·Π‘Ρ‚Ρ€ΠΎΠΊΠΈ(Π‘Ρ‚Ρ€ΠΎΠΊΠ°) Экспорт

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = Π Π΅Π³Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅("(\d+)").Π˜ΡΠΊΠ°Ρ‚ΡŒ(Π‘Ρ‚Ρ€ΠΎΠΊΠ°);

Если Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.НайдСно() Π’ΠΎΠ³Π΄Π°

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Число(Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.НайдСнноС(1));

Π˜Π½Π°Ρ‡Π΅

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;

ΠšΠΎΠ½Π΅Ρ†Π•ΡΠ»ΠΈ;

ΠšΠΎΠ½Π΅Ρ†Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: РСгулярныС выраТСния Π² 1Π‘ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΡ‘ΠΌΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Для Ρ‚Π°Π±Π»ΠΈΡ† с Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ 10 000 записСй Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… массивов Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€ΠΈ сортировкС дСсятков тысяч строк простыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ становятся нСэффСктивными. Рассмотрим ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ:

ΠœΠ΅Ρ‚ΠΎΠ΄ Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
Число() Π² запросС Низкая Ошибки Π½Π° нСчисловых Π΄Π°Π½Π½Ρ‹Ρ… ΠœΠ°Π»Ρ‹Π΅ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ (<1000 строк)
Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ нулями БрСдняя Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ знания max Π΄Π»ΠΈΠ½Ρ‹ Π‘Ρ€Π΅Π΄Π½ΠΈΠ΅ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ (1000–50000 строк)
ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Высокая Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ (>50000 строк)
Π˜Π½Π΄Π΅ΠΊΡΡ‹ ΠΏΠΎ вычисляСмым полям ΠžΡ‡Π΅Π½ΡŒ высокая Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ большиС Π΄Π°Π½Π½Ρ‹Π΅

Для ускорСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с большими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ рСкомСндуСтся:

  1. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ рассчитанными числовыми значСниями.
  2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ вмСсто построчной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.
  3. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ сСрвСрныС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ вмСсто клиСнтских для тяТСлых вычислСний.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ 100 000 строк:

// БСрвСрная функция

Ѐункция ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒΠ”Π°Π½Π½Ρ‹Π΅Π”Π»ΡΠ‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ(Π’Ρ‹Π±ΠΎΡ€ΠΊΠ°)

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = Новый Π’Π°Π±Π»ΠΈΡ†Π°Π—Π½Π°Ρ‡Π΅Π½ΠΈΠΉ;

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.Колонки.Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ("Π‘Ρ‚Ρ€ΠΎΠΊΠ°");

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.Колонки.Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ("ЧислоДляБортировки", Новый ОписаниСВипов("Число"));

Для КаТдого Π‘Ρ‚Ρ€ΠΎΠΊΠ° Из Π’Ρ‹Π±ΠΎΡ€ΠΊΠ° Π¦ΠΈΠΊΠ»

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ°

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ();

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.ПослСдний().Π‘Ρ‚Ρ€ΠΎΠΊΠ° = Π‘Ρ‚Ρ€ΠΎΠΊΠ°.Артикул;

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.ПослСдний().ЧислоДляБортировки = Число(Π‘Ρ‚Ρ€Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ(Π‘Ρ‚Ρ€ΠΎΠΊΠ°.Артикул, " ", ""));

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

// ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅ΠΌ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСльзя ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ;

ΠšΠΎΠ½Π΅Ρ†ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠΈ;

ΠšΠΎΠ½Π΅Ρ†Π¦ΠΈΠΊΠ»Π°;

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ("ЧислоДляБортировки");

ΠšΠΎΠ½Π΅Ρ†Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСрвСрныС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹|Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с вычисляСмыми полями|ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ ΠΏΠΎ 1000-5000 строк|Π˜Π·Π±Π΅Π³Π°Ρ‚ΡŒ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Ρ†ΠΈΠΊΠ»Π°Ρ…|ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ-->

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π² ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π°Ρ… ΠΈ динамичСских списках

ΠžΡΠΎΠ±Ρ‹ΠΉ случай β€” ΠΊΠΎΠ³Π΄Π° сортировка строк ΠΊΠ°ΠΊ чисСл трСбуСтся Π² ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π°Ρ… ΠΈΠ»ΠΈ динамичСских списках. Π—Π΄Π΅ΡΡŒ нСльзя Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запрос, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ:

1. ИспользованиС вычисляСмых ΠΏΠΎΠ»Π΅ΠΉ

Π’ схСмС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ вычисляСмоС ΠΏΠΎΠ»Π΅ с ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ строки Π² число:

ПолС = Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅("Число(Π‘Ρ‚Ρ€Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ(Артикул, "" "", """"))");

ПолС.Имя = "АртикулЧисло";

ПолС.ВипЗначСния = Новый Π’ΠΈΠΏ("Число");

2. Настройка сортировки Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… настройках

Если ΠΎΡ‚Ρ‡Ρ‘Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ настройки, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ для сортировки:

  1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ ЧисловойАртикул Π² настройках ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π°.
  2. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ значСниями Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠŸΡ€ΠΈΠšΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.
  3. НастройтС сортировку ΠΏΠΎ этому полю.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°:

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠŸΡ€ΠΈΠšΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°(Π”Π°Π½Π½Ρ‹Π΅Π Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ, Π”Π°Π½Π½Ρ‹Π΅ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹)

Если Π”Π°Π½Π½Ρ‹Π΅ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π°.Артикул <> НСопрСдСлён Π’ΠΎΠ³Π΄Π°

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ°

Π”Π°Π½Π½Ρ‹Π΅ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π°.ЧисловойАртикул = Число(Π‘Ρ‚Ρ€Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ(Π”Π°Π½Π½Ρ‹Π΅ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π°.Артикул, " ", ""));

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π”Π°Π½Π½Ρ‹Π΅ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π°.ЧисловойАртикул = 0;

ΠšΠΎΠ½Π΅Ρ†ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠΈ;

ΠšΠΎΠ½Π΅Ρ†Π•ΡΠ»ΠΈ;

ΠšΠΎΠ½Π΅Ρ†ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π’ динамичСских списках 1Π‘ сортировка ΠΏΠΎ вычисляСмым полям ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Волько Π²ΠΈΠ΄ΠΈΠΌΡ‹Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ". ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ этот Ρ€Π΅ΠΆΠΈΠΌ Π² настройках списка.

Π’ΠΈΠΏΠΎΠ²Ρ‹Π΅ ошибки ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ

ΠŸΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сортировки строк ΠΊΠ°ΠΊ чисСл Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ часто ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ:

  • πŸ’₯ Ошибка прСобразования Ρ‚ΠΈΠΏΠΎΠ²: ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ строку "ABC123" ΠΈΠ»ΠΈ пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² число. РСшСниС: всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ°...Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.
  • πŸ“ НСучтённая Π΄Π»ΠΈΠ½Π° строк: ΠΏΡ€ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ нулями Π½Π΅Π²Π΅Ρ€Π½ΠΎ рассчитана максимальная Π΄Π»ΠΈΠ½Π°. РСшСниС: ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ строки Π² Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅.
  • 🌐 ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с локалью: Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языковых настройках Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ Π΄Ρ€ΠΎΠ±Π½ΠΎΠΉ части являСтся запятая, Π° Π½Π΅ Ρ‚ΠΎΡ‡ΠΊΠ°. РСшСниС: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π’Π°Π»() вмСсто Число().
  • πŸ”„ РСкурсивная сортировка: ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² сортировки Π½Π° ΡƒΠΆΠ΅ отсортированных Π΄Π°Π½Π½Ρ‹Ρ…. РСшСниС: провСряйтС Ρ„Π»Π°Π³ Π£ΠΆΠ΅ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок прСобразования:

Ѐункция Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ΅ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅Π’Π§ΠΈΡΠ»ΠΎ(Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠŸΠΎΠ£ΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ = 0)

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ°

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Число(Π‘Ρ‚Ρ€Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ(Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, " ", ""));

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠŸΠΎΠ£ΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ;

ΠšΠΎΠ½Π΅Ρ†ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠΈ;

ΠšΠΎΠ½Π΅Ρ†Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° распространённая ошибка β€” ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈ сортировкС Π±ΠΎΠ»ΡŒΡˆΠΈΡ… массивов. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ:

// ΠŸΠ»ΠΎΡ…ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: построчная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π² клиСнтском ΠΊΠΎΠ΄Π΅

Для КаТдого Π‘Ρ‚Ρ€ΠΎΠΊΠ° Из Π‘ΠΎΠ»ΡŒΡˆΠ°ΡΠ’Π°Π±Π»ΠΈΡ†Π° Π¦ΠΈΠΊΠ»

Π‘Ρ‚Ρ€ΠΎΠΊΠ°.ЧисловоСЗначСниС = Число(Π‘Ρ‚Ρ€ΠΎΠΊΠ°.Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²ΠΎΠ΅Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅);

ΠšΠΎΠ½Π΅Ρ†Π¦ΠΈΠΊΠ»Π°;

Для Ρ‚Π°Π±Π»ΠΈΡ† Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π±ΠΎΠ»Π΅Π΅ 10 000 строк такая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ нСсколько ΠΌΠΈΠ½ΡƒΡ‚. ВсСгда пСрСноситС тяТСлыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π° сСрвСр!

πŸ“Š Какой ΠΌΠ΅Ρ‚ΠΎΠ΄ сортировки строк ΠΊΠ°ΠΊ чисСл Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‡Π°Ρ‰Π΅ всСго?
ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² число (Число/Π’Π°Π»)
Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Π΅Π΄ΡƒΡ‰ΠΈΠΌΠΈ нулями
РСгулярныС выраТСния
БобствСнныС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹
НС ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽ

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹: внСшниС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈ SQL

Если встроСнныС срСдства 1Π‘ Π½Π΅ ΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ с Π·Π°Π΄Π°Ρ‡Π΅ΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΡ‡Π΅Π½ΡŒ большими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ слоТными ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ сортировки), ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

1. ИспользованиС SQL-запросов

Для Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° MS SQL Server ΠΈΠ»ΠΈ PostgreSQL ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ этих Π‘Π£Π‘Π”:

  • πŸ”§ MS SQL: функция CAST ΠΈΠ»ΠΈ TRY_CAST (для бСзопасного прСобразования).
  • 🐘 PostgreSQL: ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ::integer ΠΈΠ»ΠΈ функция to_number().

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ SQL-запроса для MS SQL:

ВЫБРАВЬ

Π’ΠΎΠ²Π°Ρ€Ρ‹.Артикул КАК Артикул

Π˜Π—

dbo._Reference16 Π’ΠΎΠ²Π°Ρ€Ρ‹

Π£ΠŸΠžΠ Π―Π”ΠžΠ§Π˜Π’Π¬ ПО

TRY_CAST(Π’ΠΎΠ²Π°Ρ€Ρ‹.Артикул AS INT)

2. Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

Для слоТных сцСнариСв (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сортировки строк с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ ΠΈ Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ ΠΏΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ) ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ внСшнюю ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ Π½Π° C# ΠΈΠ»ΠΈ C++, которая Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ кастомный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сравнСния. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°:

  • ⚑ Высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС, Ρ‡Π΅ΠΌ 1Π‘-скрипты).
  • πŸŽ›οΈ Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ: ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ сортировки.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ интСрфСйса ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π½Π° C#:

[ComVisible(true)]

public interface IStringSorter

{

void Sort(ref Array strings, string pattern);

int Compare(string a, string b);

}

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ИспользованиС Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π² 1Π‘ (ΠΏΡ€Π°Π²Π° Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ внСшнСго ΠΊΠΎΠ΄Π°) ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π² ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ… ΠΈΠ»ΠΈ Ρ‚ΠΎΠ½ΠΊΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅.
Как ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ внСшнюю ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ Π² 1Π‘?

1. Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ DLL с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΉ ΠΈ зарСгистрируйтС Π΅Ρ‘ Π½Π° сСрвСрС 1Π‘ (regsvr32).

2. Π’ ΠΌΠΎΠ΄ΡƒΠ»Π΅ 1Π‘ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ: Новый COMΠžΠ±ΡŠΠ΅ΠΊΡ‚("YourComponent.ProgID").

3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ для сортировки: Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ.Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ(ΠœΠ°ΡΡΠΈΠ²Π‘Ρ‚Ρ€ΠΎΠΊ).

4. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π²Π΅Π±-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Safe for Scripting ΠΈ Safe for Initialization.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ:

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ°

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ = Новый COMΠžΠ±ΡŠΠ΅ΠΊΡ‚("StringSorter.Component");

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ.Sort(ΠœΠ°ΡΡΠΈΠ²Π”Π°Π½Π½Ρ‹Ρ…, "(\d+)");

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π‘ΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ("НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ сортировки!");

ΠšΠΎΠ½Π΅Ρ†ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠΈ;

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Π Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ нСсколько Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… сцСнариСв, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ 1Π‘.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1: Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π°Ρ€Ρ‚ΠΈΠΊΡƒΠ»ΠΎΠ² Π² справочникС Π½ΠΎΠΌΠ΅Π½ΠΊΠ»Π°Ρ‚ΡƒΡ€Ρ‹

Π—Π°Π΄Π°Ρ‡Π°: ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Π½ΠΊΠ»Π°Ρ‚ΡƒΡ€Ρƒ ΠΏΠΎ Π°Ρ€Ρ‚ΠΈΠΊΡƒΠ»Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранятся ΠΊΠ°ΠΊ строки, Π½ΠΎ содСрТат числа (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "A-1", "A-10", "A-2").

РСшСниС с использованиСм рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΠΠΎΠΌΠ΅Π½ΠΊΠ»Π°Ρ‚ΡƒΡ€ΡƒΠŸΠΎΠΡ€Ρ‚ΠΈΠΊΡƒΠ»Π°ΠΌ()

Запрос = Новый Запрос;

Запрос.ВСкст =

"ВЫБРАВЬ

| НомСнклатура.Бсылка КАК Бсылка,

| НомСнклатура.Артикул КАК Артикул,

| РСгВыраТСниСНайти(""(\d+)"" , НомСнклатура.Артикул) КАК Π§ΠΈΡΠ»ΠΎΠ²Π°ΡΠ§Π°ΡΡ‚ΡŒ

|Π˜Π—

| Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ.НомСнклатура КАК НомСнклатура

|Π£ΠŸΠžΠ Π―Π”ΠžΠ§Π˜Π’Π¬ ПО

| Число(Π•Π‘Π’Π¬NULL(Π§ΠΈΡΠ»ΠΎΠ²Π°ΡΠ§Π°ΡΡ‚ΡŒ, ""0""))";

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = Запрос.Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ();

Π’Ρ‹Π±ΠΎΡ€ΠΊΠ° = Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ();

ΠšΠΎΠ½Π΅Ρ†ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

Π—Π°Π΄Π°Ρ‡Π°: ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранятся ΠΊΠ°ΠΊ строки (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "0001", "0010", "0100").

РСшСниС с Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ нулями:

Ѐункция ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΠ§ΠΈΡΠ»ΠΎΠ²ΠΎΠΉΠΠΎΠΌΠ΅Ρ€(НомСрБтрокой)

// УдаляСм всС Π½Π΅Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ символы

ЧисловаяБтрока = Π Π΅Π³Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅(""\D"").Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ(НомСрБтрокой, """");

Если ЧисловаяБтрока = """" Π’ΠΎΠ³Π΄Π°

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;

Π˜Π½Π°Ρ‡Π΅

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Число(ЧисловаяБтрока);

ΠšΠΎΠ½Π΅Ρ†Π•ΡΠ»ΠΈ;

ΠšΠΎΠ½Π΅Ρ†Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π΅:

ПолС = Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅("ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΠ§ΠΈΡΠ»ΠΎΠ²ΠΎΠΉΠΠΎΠΌΠ΅Ρ€(НомСрДокумСнта)");

ПолС.Имя = "НомСрДляБортировки";

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3: Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π² динамичСском спискС

Π—Π°Π΄Π°Ρ‡Π°: Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ сортировку ΠΏΠΎ числовому Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ строкового Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Π° Π² динамичСский список.

РСшСниС:

  1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ Ρ„ΠΎΡ€ΠΌΡ‹ ЧисловоСЗначСниСДляБортировки.
  2. Π’ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ΠŸΡ€ΠΈΠΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈΠ‘Ρ‚Ρ€ΠΎΠΊΠΈ заполняйтС Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
  3. НастройтС сортировку списка ΠΏΠΎ этому Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρƒ.

Код ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°:

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π”ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΈΠΉΠ‘ΠΏΠΈΡΠΎΠΊΠŸΡ€ΠΈΠΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈΠ‘Ρ‚Ρ€ΠΎΠΊΠΈ(Π­Π»Π΅ΠΌΠ΅Π½Ρ‚, Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Π°ΡΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°)

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Π°ΡΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° = Π›ΠΎΠΆΡŒ;

ВСкущаяБтрока = Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹.ДинамичСскийБписок.Π’Π΅ΠΊΡƒΡ‰ΠΈΠ΅Π”Π°Π½Π½Ρ‹Π΅;

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ°

ВСкущаяБтрока.ЧисловоСЗначСниСДляБортировки =

Число(Π‘Ρ‚Ρ€Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ(ВСкущаяБтрока.Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²ΠΎΠ΅ΠŸΠΎΠ»Π΅, " ", ""));

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ВСкущаяБтрока.ЧисловоСЗначСниСДляБортировки = 0;

ΠšΠΎΠ½Π΅Ρ†ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠΈ;

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Π°ΡΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° = Π˜ΡΡ‚ΠΈΠ½Π°;

ΠšΠΎΠ½Π΅Ρ†ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹

πŸ’‘

Для динамичСских списков всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠŸΡ€ΠΈΠΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈΠ‘Ρ‚Ρ€ΠΎΠΊΠΈ вмСсто построчной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ всСго списка β€” это Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускоряСт Ρ€Π°Π±ΠΎΡ‚Ρƒ с большими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

FAQ: ЧастыС вопросы ΠΏΠΎ сортировкС строк ΠΊΠ°ΠΊ чисСл Π² 1Π‘

Как ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строки с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ ΠΈ Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "A1", "A10", "A2")?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ извлСчСния числовой части ΠΈ сортировки ΠΏΠΎ Π΄Π²ΡƒΠΌ критСриям:

  1. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎ Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎΠΉ части (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π›Π΅Π²(Π‘Ρ‚Ρ€ΠΎΠΊΠ°, 1)).
  2. Π—Π°Ρ‚Π΅ΠΌ ΠΏΠΎ числовой части, ΠΈΠ·Π²Π»Π΅Ρ‡Ρ‘Π½Π½ΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСгулярного выраТСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:

Запрос.ВСкст =

"ВЫБРАВЬ

| ПолС КАК Π‘Ρ‚Ρ€ΠΎΠΊΠ°,

| Π›Π΅Π²(ПолС, 1) КАК Π‘ΡƒΠΊΠ²Π΅Π½Π½Π°ΡΠ§Π°ΡΡ‚ΡŒ,

| Число(РСгВыраТСниСНайти(""(\d+)"" , ПолС)) КАК Π§ΠΈΡΠ»ΠΎΠ²Π°ΡΠ§Π°ΡΡ‚ΡŒ

|Π£ΠŸΠžΠ Π―Π”ΠžΠ§Π˜Π’Π¬ ПО

| Π‘ΡƒΠΊΠ²Π΅Π½Π½Π°ΡΠ§Π°ΡΡ‚ΡŒ,

| Π§ΠΈΡΠ»ΠΎΠ²Π°ΡΠ§Π°ΡΡ‚ΡŒ";

ΠŸΠΎΡ‡Π΅ΠΌΡƒ сортировка Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…?

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹:

  • ΠŸΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π² клиСнтском ΠΊΠΎΠ΄Π΅ (пСрСноситС Π»ΠΎΠ³ΠΈΠΊΡƒ Π½Π° сСрвСр).
  • ИспользованиС рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Ρ†ΠΈΠΊΠ»Π°Ρ… (Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ).
  • ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ индСксов Π½Π° полях, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΈΠ΄Ρ‘Ρ‚ сортировка.

Для ускорСния:

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ рассчитанными значСниями.
  • ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠΉΡ‚Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎ 1000 строк Π·Π° Ρ€Π°Π·).
  • Для SQL-Π±Π°Π· настройтС индСксы ΠΏΠΎ вычисляСмым полям.
Как ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строки с раздСлитСлями тысяч (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "1 000", "2 500")?

Π£Π΄Π°Π»ΠΈΡ‚Π΅ всС Π½Π΅Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ символы ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ:

Ѐункция БтроковоСЧислоВЧисло(Π‘Ρ‚Ρ€ΠΎΠΊΠ°)

Π‘Ρ‚Ρ€ΠΎΠΊΠ°Π‘Π΅Π·Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ = Π Π΅Π³Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅("\D").Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ(Π‘Ρ‚Ρ€ΠΎΠΊΠ°, "");

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Число(Π‘Ρ‚Ρ€ΠΎΠΊΠ°Π‘Π΅Π·Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ);

ΠšΠΎΠ½Π΅Ρ†Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Или ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π’Π°Π»(), которая ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π³ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ настройки:

ЧисловоСЗначСниС = Π’Π°Π»(Π‘Ρ‚Ρ€Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ(Π‘Ρ‚Ρ€ΠΎΠΊΠ°, " ", ""));
МоТно Π»ΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строки ΠΊΠ°ΠΊ числа нСпосрСдствСнно Π² SQL-запросС ΠΊ Π±Π°Π·Π΅ 1Π‘?

Π”Π°, Π½ΠΎ с ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ:

  • Для MS SQL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ CAST(ПолС AS INT) ΠΈΠ»ΠΈ TRY_CAST.
  • Для PostgreSQL ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚ CAST(ПолС AS INTEGER).
  • Π’ 1Π‘ этот запрос Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π² Новый Запрос с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Запрос.Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€("UseSQL", Π˜ΡΡ‚ΠΈΠ½Π°).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

Запрос = Новый Запрос;

Запрос.Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€("UseSQL", Π˜ΡΡ‚ΠΈΠ½Π°);

Запрос.ВСкст =

"ВЫБРАВЬ

| ПолС1,

| ПолС2

|Π˜Π— Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚.ΠœΠΎΠΉΠ”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚

|Π£ΠŸΠžΠ Π―Π”ΠžΠ§Π˜Π’Π¬ ПО CAST(ΠΠΎΠΌΠ΅Ρ€ΠšΠ°ΠΊΠ‘Ρ‚Ρ€ΠΎΠΊΠ° AS INT)";

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Ρ‚Π°ΠΊΠΎΠΉ запрос Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ 1Π‘.

Как ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π΅ Π½Π° Π‘ΠšΠ” ΠΏΠΎ строковому полю ΠΊΠ°ΠΊ ΠΏΠΎ числовому?

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² схСму ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… вычисляСмоС ΠΏΠΎΠ»Π΅:

  1. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ конструктор схСмы ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ.
  2. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° Π·Π°ΠΊΠ»Π°Π΄ΠΊΡƒ "ВычисляСмыС поля".
  3. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ»Π΅ с Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Число(Π‘Ρ‚Ρ€Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ(Π’Π°ΡˆΠ΅ΠŸΠΎΠ»Π΅, " ", "")).
  4. Π’ настройках ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π° ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ сортировку ΠΏΠΎ этому полю.

Если ΠΏΠΎΠ»Π΅ содСрТит Π±ΡƒΠΊΠ²Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для извлСчСния числовой части.