Saya ingin menggunakan huruf kapital hanya huruf pertama dari setiap kata dari setiap kalimat dalam kolom SQL.
Misalnya, jika kalimatnya adalah:
'Aku suka film'
maka saya perlu output:
'Aku suka film'
Pertanyaan:
declare @a varchar(15)
set @a = 'qWeRtY kEyBoArD'
select @a as [Normal text],
upper(@a) as [Uppercase text],
lower(@a) as [Lowercase text],
upper(left(@a,1)) + lower(substring(@a,2,len(@a))) as [Capitalize first letter only]
Di sini saya melakukan huruf besar, kecil, dan huruf besar hanya di kolom saya (di sini saya hanya menempatkan kata acak).
Inilah hasil saya:
Apakah ada kemungkinan untuk melakukan itu?
Adakah kemungkinan untuk mendapatkan hasil tanpa menggunakan fungsi yang ditentukan pengguna?
Saya butuh hasilnya Qwerty Keyboard
sql-server
sql-server-2014
Marin Mohanadas
sumber
sumber
Jawaban:
Ini pertama-tama mengubah string menjadi XML dengan mengganti semua spasi dengan tag kosong
<X/>
. Kemudian itu merobek XML untuk mendapatkan satu kata per baris menggunakannodes()
. Untuk mendapatkan kembali baris ke satu nilai itu menggunakanfor xml path
trik.sumber
for xml path
trik untuk penggabungan. Kecuali Anda menggunakan CLR yang akan menjadi pilihan terbaik jika kecepatan dan efisiensi penting.Di SQL Server 2016 Anda bisa melakukan ini dengan R, mis
Apakah Anda harus atau tidak adalah pertanyaan yang berbeda:)
sumber
Mungkin saya bodoh tetapi memeriksa kueri di bawah ini yang saya tulis terhadap beberapa yang disediakan, ini tampaknya sedikit lebih efisien (tergantung pada pengindeksan).
Kode ini agak bodoh, tetapi tidak ada pepatah yang mengatakan bahwa jika terlihat bodoh tetapi berfungsi maka itu tidak bodoh.
sumber
Pilihan lain adalah menangani ini melalui SQLCLR. Bahkan ada metode yang sudah tersedia di .NET yang melakukan ini: TextInfo.ToTitleCase (dalam
System.Globalization
). Metode ini akan Huruf Besar huruf pertama dari setiap kata, dan Huruf Kecil huruf yang tersisa. Tidak seperti proposal lain di sini, ia juga melompati kata-kata dalam huruf besar semua, dengan asumsi mereka akronim. Tentu saja, jika perilaku ini diinginkan, akan cukup mudah untuk memperbarui saran T-SQL untuk melakukan ini juga.Salah satu manfaat dari metode .NET adalah dapat menggunakan huruf besar yang merupakan karakter tambahan. Sebagai contoh: SURAT DESERET KECIL OW memiliki pemetaan huruf besar dari DESERET MODAL SURAT OW (keduanya muncul sebagai kotak ketika saya tempelkan ke sini) , tetapi
UPPER()
fungsinya tidak mengubah versi huruf kecil ke huruf besar, bahkan ketika Collation default untuk Database saat ini diatur keLatin1_General_100_CI_AS_SC
. Ini tampaknya konsisten dengan dokumentasi MSDN yang tidak mencantumkanUPPER
danLOWER
di bagan fungsi yang berperilaku berbeda saat menggunakan_SC
Collation: Collation and Unicode Support: Character Tambahan .Pengembalian (diperbesar sehingga Anda benar-benar dapat melihat Karakter Tambahan):
Anda dapat melihat daftar lengkap (dan saat ini) karakter yang huruf kecil dan berubah menjadi huruf besar menggunakan fitur pencarian berikut di Unicode.org (Anda dapat melihat Karakter Tambahan dengan menggulir ke bawah sampai Anda sampai ke "DESERET" bagian, atau cukup tekan Control-Fdan cari kata itu):
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%3AChanges_When_Titlecased%3DYes%3A%5D
Meskipun sejujurnya, ini bukan manfaat besar karena diragukan bahwa ada orang yang benar-benar menggunakan Karakter Tambahan yang bisa dijadikan judul. Either way, di sini adalah kode SQLCLR:
Berikut ini adalah saran dari @ MikaelEriksson - dimodifikasi sedikit untuk menangani
NVARCHAR
data serta melewatkan kata-kata yang semuanya huruf besar (untuk lebih mencocokkan perilaku metode .NET) - bersama dengan uji implementasi T-SQL dan implementasi SQLCLR:Perbedaan lain dalam perilaku adalah bahwa implementasi T-SQL khusus ini terbagi pada ruang-ruang saja, sedangkan
ToTitleCase()
metode ini menganggap sebagian besar non-huruf sebagai pemisah kata (maka perbedaan dalam penanganan bagian "satu & DUA").Kedua implementasi menangani menggabungkan urutan dengan benar. Masing-masing huruf beraksen dalam "ÜvÜlA" terdiri dari huruf dasar dan kombinasi diaeresis / umlaut (dua titik di atas setiap huruf), dan keduanya dikonversi dengan benar ke kasus lain di kedua pengujian.
Akhirnya, satu kerugian yang tidak terduga dari versi SQLCLR adalah bahwa dengan melakukan berbagai tes, saya menemukan bug dalam kode .NET terkait dengan penanganannya pada Circled Letters (yang sekarang telah dilaporkan di Microsoft Connect - UPDATE: Connect telah pindah ke
/dev/null
- secara harfiah - jadi saya mungkin perlu mengirim ulang ini jika masalahnya masih ada). Pustaka .NET memperlakukan Circled Letters sebagai pemisah kata, itulah sebabnya ia tidak mengubah "ⓐDD" menjadi "Ⓐdd" sebagaimana mestinya.FYI
Fungsi SQLCLR pra-selesai mengenkapsulasi
TextInfo.ToTitleCase
metode yang disebutkan di atas sekarang tersedia dalam versi Gratis SQL # (yang saya tulis) sebagai String_ToTitleCase dan String_ToTitleCase4k .😺
sumber
Sebagai alternatif untuk jawaban Mikael Eriksson , Anda dapat mempertimbangkan menggunakan penanganan T-SQL eksklusif dari pengaturan variabel dalam pernyataan pilih multi-baris.
Dalam SQL Server, ketika variabel sedang diset sebagai bagian dari pernyataan SELECT, setiap baris akan menjalankan iterasi dari logika yang ditetapkan.
Orang-orang sering menggunakan metode ini untuk merangkai string, meskipun itu tidak didukung dan ada beberapa masalah yang secara resmi didokumentasikan dengannya . Masalah resmi berkaitan dengan karakteristik ORDER BY tertentu, dan kami tidak memerlukannya di sini, jadi mungkin itu pilihan yang aman.
Di sini, kami mengulangi 26 huruf alfabet dan menggantinya dengan versi huruf besar jika didahului oleh spasi. (Kami menyiapkan string awalnya dengan huruf besar huruf pertama dan membuat huruf kecil sisanya, seperti yang Anda lakukan dalam pertanyaan Anda.)
SQL sedikit rumit karena membutuhkan penggunaan Tally Table - tabel angka - untuk menghasilkan 26 iterasi untuk menggantikan yang dilakukannya. Anda bisa membuat fungsi yang ditentukan pengguna (TVF) bernilai tabel inline berguna untuk menghasilkan tabel angka atau Anda bahkan bisa menggunakan tabel fisik.
Kelemahan dari opsi ini adalah tidak bisa menjadi bagian dari TVF inline karena perlu melibatkan pengaturan variabel. Jadi jika Anda ingin menerapkan metode ini ke kolom output Anda, Anda perlu membungkusnya menjadi TVF multi-pernyataan atau fungsi yang ditentukan pengguna skalar.
Namun, rencana kuerinya jauh lebih sederhana dan mungkin jauh lebih cepat daripada metode XML. Anda bisa berdebat juga lebih mudah untuk dipahami (terutama jika Anda memiliki tabel penghitungan sendiri).
(Saya menguji ini menggunakan string yang jauh lebih besar dan sekitar 6ms vs 14ms untuk solusi XML.)
Ada sejumlah batasan tambahan dengan solusi ini. Seperti yang ditulis, ini mengasumsikan susunan case-case yang tidak sensitif, meskipun Anda bisa menghilangkan masalah itu dengan menentukan collation atau menjalankan LCASE pada istilah pencarian, dengan mengorbankan beberapa kinerja. Itu juga hanya membahas surat-surat ASCII standar dan bergantung pada penempatan mereka di set karakter , sehingga tidak akan melakukan apa pun dengan ñ.
sumber
Dengan asumsi Anda hanya ingin menggunakan huruf besar untuk kata-kata setelah spasi, berikut ini adalah cara lain untuk melakukannya.
sumber
Mungkin bukan anti peluru tapi saya harap ini merupakan kontribusi yang bermanfaat untuk utas ini.
sumber
Di bawah ini adalah prosedur yang saya gunakan dalam basis data Firebird untuk melakukan ini. Mungkin bisa dibersihkan banyak tetapi itu menyelesaikan pekerjaan untuk saya.
sumber
CTE rekursif cukup baik untuk hal semacam ini.
Mungkin tidak terlalu efisien untuk operasi besar, tetapi memungkinkan untuk jenis operasi ini dalam pernyataan pilih SQL murni:
Keluaran:
sumber
Saya suka versi ini. Ini sederhana, dan dapat digunakan untuk membuat fungsi, Anda hanya perlu memiliki versi SQL Server yang tepat:
sumber
Saya harap akan membantu ...
sumber
Data Uji
Penerapan
sumber