Apakah ada cara mudah untuk menemukan indeks kemunculan terakhir string menggunakan SQL? Saya menggunakan SQL Server 2000 sekarang. Saya pada dasarnya membutuhkan fungsionalitas yang System.String.LastIndexOf
disediakan oleh metode .NET . Sedikit googling mengungkapkan ini - Function To Retrieve Last Index - tetapi itu tidak berfungsi jika Anda memasukkan ekspresi kolom "teks". Solusi lain yang ditemukan di tempat lain hanya berfungsi selama teks yang Anda cari panjangnya 1 karakter.
Saya mungkin harus memasak fungsi. Jika saya melakukannya, saya akan mempostingnya di sini sehingga kalian dapat melihatnya dan mungkin memanfaatkannya.
DATALENGTH
mengembalikan jumlah byte bukan karakter. Oleh karena itu,DATALENGTH
mengembalikan 2 x jumlah karakter dalam string untukNVARCHAR
string.LEN
, namun, mengembalikan jumlah karakter, minus spasi spasi apa pun . Saya tidak pernah menggunakanDATALENGTH
untuk perhitungan panjang karakter kecuali spasi spasi penting dan saya tahu pasti bahwa tipe data saya konsisten, apakah ituVARCHAR
atauNVARCHAR
Cara langsung? Tidak, tapi saya telah menggunakan yang sebaliknya. Secara harfiah.
Dalam rutinitas sebelumnya, untuk menemukan kemunculan terakhir dari string yang diberikan, saya menggunakan fungsi REVERSE (), mengikuti CHARINDEX, diikuti lagi oleh REVERSE untuk mengembalikan urutan asli. Misalnya:
memperlihatkan bagaimana cara mengekstrak nama file database aktual dari "nama fisik" mereka, tidak peduli seberapa dalam di subfolder. Ini hanya mencari satu karakter (garis miring terbalik), tetapi Anda dapat membangun ini untuk string pencarian yang lebih lama.
Satu-satunya downside adalah, saya tidak tahu seberapa baik ini akan bekerja pada tipe data TEXT. Saya sudah menggunakan SQL 2005 selama beberapa tahun sekarang, dan saya tidak lagi mahir bekerja dengan TEKS - tetapi saya ingat Anda dapat menggunakan KIRI dan KANAN di atasnya?
Philip
sumber
Cara paling sederhana adalah ....
sumber
[expr]
simbol Anda lebih dari 1, Anda juga harus membalikkannya!Jika Anda menggunakan Sqlserver 2005 atau lebih baru, menggunakan
REVERSE
fungsi berkali-kali merugikan kinerja, kode di bawah ini lebih efisien.sumber
sumber
Pertanyaan lama tetapi masih valid, jadi inilah yang saya buat berdasarkan info yang diberikan oleh orang lain di sini.
sumber
Ini bekerja sangat baik untuk saya.
sumber
bekerja lebih baik untukku
sumber
Hmm, saya tahu ini adalah utas lama, tetapi tabel penghitungan bisa melakukan ini di SQL2000 (atau database lain):
Tabel penghitungan hanyalah tabel angka yang bertambah.
Semakin
substring(@str, _Tally.n, 1) = @delim
mendapat posisi masing-masing pembatas, maka Anda hanya mendapatkan posisi maksimum di set itu.Tabel penghitungan mengagumkan. Jika Anda belum pernah menggunakannya sebelumnya, ada artikel bagus tentang SQL Server Central (Free reg, atau cukup gunakan Bug Me Not ( http://www.bugmenot.com/view/sqlservercentral.com )).
* EDIT: Dihapus
n <= LEN(TEXT_FIELD)
, karena Anda tidak dapat menggunakan LEN () pada jenis TEXT. Selamasubstring(...) = @delim
sisa - sisa meskipun hasilnya masih benar.sumber
Balikkan string dan substring Anda, lalu cari kejadian pertama.
sumber
Beberapa jawaban lain mengembalikan string yang sebenarnya sedangkan saya lebih perlu tahu int indeks yang sebenarnya. Dan jawaban yang melakukan itu tampaknya terlalu rumit. Menggunakan beberapa jawaban lain sebagai inspirasi, saya melakukan yang berikut ...
Pertama, saya membuat fungsi:
Kemudian, dalam kueri Anda, Anda bisa melakukan ini:
Di atas harus mengembalikan 23 (indeks terakhir ':')
Semoga ini membuatnya sedikit lebih mudah bagi seseorang!
sumber
Saya menyadari ini adalah pertanyaan lama beberapa tahun, tapi ...
Aktif
Access 2010
, Anda dapat menggunakannyaInStrRev()
untuk melakukan ini. Semoga ini membantu.sumber
Jawaban ini menggunakan MS SQL Server 2008 (saya tidak memiliki akses ke MS SQL Server 2000), tetapi cara saya melihatnya menurut OP adalah 3 situasi yang harus dipertimbangkan. Dari apa yang saya coba tidak ada jawaban di sini mencakup semuanya 3:
0
Fungsi yang saya buat membutuhkan 2 parameter:
@String NVARCHAR(MAX)
: String yang akan dicari@FindString NVARCHAR(MAX)
: Baik karakter tunggal atau sub-string untuk mendapatkan indeks terakhir dalam@String
Ini mengembalikan
INT
yang baik indeks positif@FindString
dalam@String
atau0
artinya@FindString
tidak masuk@String
Berikut adalah penjelasan tentang apa fungsi ini:
@ReturnVal
untuk0
menunjukkan itu@FindString
tidak ada@String
@FindString
masuk@String
dengan menggunakanCHARINDEX()
@FindString
dalam@String
adalah0
,@ReturnVal
dibiarkan sebagai0
@FindString
dalam@String
adalah> 0
,@FindString
dalam@String
maka menghitung indeks terakhir@FindString
dalam@String
dengan menggunakanREVERSE()
@ReturnVal
yang merupakan angka positif yang merupakan indeks terakhir@FindString
dalam@String
atau0
menunjukkan bahwa@FindString
tidak ada@String
Berikut skrip fungsi buat (siap salin dan tempel):
Inilah sedikit yang dengan mudah menguji fungsi:
Saya hanya menjalankan ini di MS SQL Server 2008 karena saya tidak memiliki akses ke versi lain tetapi dari apa yang saya lihat ini harus baik untuk 2008+ setidaknya.
Nikmati.
sumber
Aku tahu bahwa itu akan menjadi tidak efisien tetapi apakah Anda dianggap casting
text
lapangan untukvarchar
sehingga Anda dapat menggunakan solusi yang disediakan oleh situs Anda ditemukan? Saya tahu bahwa solusi ini akan membuat masalah karena Anda berpotensi memotong catatan jika panjang ditext
lapangan melebihi panjang Andavarchar
(belum lagi itu tidak akan sangat performan).Karena data Anda berada di dalam
text
bidang (dan Anda menggunakan SQL Server 2000) opsi Anda terbatas.sumber
Jika Anda ingin mendapatkan indeks spasi terakhir dalam serangkaian kata, Anda dapat menggunakan ungkapan ini KANAN (nama, (CHARINDEX ('', REVERSE (nama), 0)) untuk mengembalikan kata terakhir dalam string. Ini sangat membantu jika Anda ingin menguraikan nama belakang dari nama lengkap yang menyertakan inisial untuk nama depan dan / atau tengah.
sumber
@indexOf = <whatever characters you are searching for in your string>
@LastIndexOf = LEN([MyField]) - CHARINDEX(@indexOf, REVERSE([MyField]))
Belum diuji, mungkin dimatikan oleh satu karena indeks nol, tetapi berfungsi dengan
SUBSTRING
baik saat memisah dari@indexOf
karakter hingga akhir string AndaSUBSTRING([MyField], 0, @LastIndexOf)
sumber
Kode ini berfungsi bahkan jika substring berisi lebih dari 1 karakter.
sumber
Saya perlu menemukan posisi terakhir backslash di path folder. Ini solusinya.
Inilah beberapa test case yang lolos
sumber
Untuk mendapatkan bagian sebelum pemisah terakhir (hanya berfungsi
NVARCHAR
karenaDATALENGTH
penggunaan):sumber
Jawaban ini memenuhi persyaratan OP. secara khusus itu memungkinkan jarum menjadi lebih dari satu karakter dan itu tidak menghasilkan kesalahan ketika jarum tidak ditemukan di tumpukan jerami. Tampaknya bagi saya bahwa sebagian besar (semua?) Jawaban lain tidak menangani kasus tepi itu. Di luar itu saya menambahkan argumen "Posisi Awal" yang disediakan oleh fungsi CharIndex MS SQL server asli. Saya mencoba persis mencerminkan spesifikasi untuk CharIndex kecuali untuk memproses kanan ke kiri, bukan kiri ke kanan. misalnya saya mengembalikan nol jika salah satu jarum atau tumpukan jerami adalah nol dan saya mengembalikan nol jika jarum tidak ditemukan di tumpukan jerami. Satu hal yang saya tidak bisa selesaikan adalah bahwa dengan fungsi bawaan parameter ketiga adalah opsional. Dengan fungsi yang ditentukan pengguna SQL Server, semua parameter harus disediakan dalam panggilan kecuali fungsi tersebut disebut menggunakan "EXEC" . Meskipun parameter ketiga harus dimasukkan dalam daftar parameter, Anda dapat memberikan kata kunci "default" sebagai pengganti untuk itu tanpa harus memberikan nilai (lihat contoh di bawah). Karena lebih mudah untuk menghapus parameter ketiga dari fungsi ini jika tidak diinginkan daripada menambahkannya jika diperlukan saya telah memasukkannya di sini sebagai titik awal.
sumber
Saya menemukan utas ini saat mencari solusi untuk masalah saya yang serupa yang memiliki persyaratan yang sama persis tetapi untuk jenis database yang berbeda yang juga tidak memiliki
REVERSE
fungsi.Dalam kasus saya ini adalah untuk database OpenEdge (Progress) , yang memiliki sintaks yang sedikit berbeda. Ini membuat
INSTR
fungsi tersedia untuk saya yang ditawarkan sebagian besar tipe database Oracle .Jadi saya datang dengan kode berikut:
Namun, untuk situasi spesifik saya (menjadi basis data OpenEdge (Progress) ) ini tidak menghasilkan perilaku yang diinginkan karena mengganti karakter dengan char kosong memberikan panjang yang sama dengan string asli. Ini tidak masuk akal bagi saya tetapi saya dapat mem-bypass masalah dengan kode di bawah ini:
Sekarang saya mengerti bahwa kode ini tidak akan menyelesaikan masalah untuk T-SQL karena tidak ada alternatif untuk
INSTR
fungsi yang menawarkanOccurence
properti.Hanya untuk menyeluruh saya akan menambahkan kode yang diperlukan untuk membuat fungsi skalar ini sehingga dapat digunakan dengan cara yang sama seperti yang saya lakukan pada contoh di atas.
Untuk menghindari hal yang jelas, ketika
REVERSE
fungsi tersedia, Anda tidak perlu membuat fungsi skalar ini dan Anda hanya bisa mendapatkan hasil yang diperlukan seperti ini:sumber