Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Bagaimana Mengurai String Seperti Pro Menggunakan Fungsi SQL SUBSTRING()?

Apakah Anda menikmati penguraian string? Jika demikian, salah satu fungsi string yang sangat diperlukan untuk digunakan adalah SQL SUBSTRING. Ini adalah salah satu keterampilan yang harus dimiliki pengembang untuk bahasa apa pun.

Jadi, bagaimana Anda melakukannya?

Poin Penting dalam Penguraian String

Asumsikan Anda baru dalam penguraian. Poin penting apa yang perlu Anda ingat?

  1. Ketahui informasi apa yang disematkan di dalam string.
  2. Dapatkan posisi yang tepat dari setiap bagian informasi dalam sebuah string. Anda mungkin harus menghitung semua karakter dalam string.
  3. Ketahui ukuran atau panjang setiap bagian informasi dalam sebuah string.
  4. Gunakan fungsi string yang tepat yang dapat mengekstrak setiap informasi dalam string dengan mudah.

Mengetahui semua faktor ini akan mempersiapkan Anda untuk menggunakan SQL SUBSTRING() dan memberikan argumen padanya.

Sintaks SUBSTRING SQL

Sintaks SQL SUBSTRING adalah sebagai berikut:

SUBSTRING(ekspresi string, awal, panjang)

  • ekspresi string – a string literal atau ekspresi SQL yang mengembalikan string.
  • mulai – nomor di mana ekstraksi akan dimulai. Ini juga berbasis 1 – karakter pertama dalam argumen ekspresi string harus dimulai dengan 1, bukan 0. Di SQL Server, selalu angka positif. Di MySQL atau Oracle, bagaimanapun, itu bisa positif atau negatif. Jika negatif, pemindaian dimulai dari akhir string.
  • panjang – panjang karakter yang akan diekstrak. SQL Server membutuhkannya. Di MySQL atau Oracle, ini opsional.

4 Contoh SQL SUBSTRING

1. Menggunakan SQL SUBSTRING untuk Mengekstrak dari String Literal

Mari kita mulai dengan contoh sederhana menggunakan string literal. Kami menggunakan nama girl grup terkenal Korea, BlackPink, dan Gambar 1 menggambarkan bagaimana SUBSTRING akan bekerja:

Kode di bawah ini menunjukkan bagaimana kita akan mengekstraknya:

-- extract 'black' from BlackPink (English)
SELECT SUBSTRING('BlackPink',1,5) AS result

Sekarang, mari kita periksa juga hasil yang ditetapkan pada Gambar 2:

Bukankah itu mudah?

Untuk mengekstrak Hitam dari BlackPink , Anda mulai dari posisi 1 dan berakhir di posisi 5. Sejak BlackPink adalah bahasa Korea, mari kita cari tahu apakah SUBSTRING berfungsi pada karakter Korea Unicode.

(PENAFIAN :Saya tidak bisa berbicara, membaca, atau menulis bahasa Korea, jadi saya mendapatkan terjemahan bahasa Korea dari Wikipedia. Saya juga menggunakan Google Terjemahan untuk melihat karakter mana yang sesuai dengan Hitam dan Merah Muda . Mohon dimaafkan jika salah. Tetap saja, saya harap poin yang saya coba jelaskan datang і seberang)

Mari kita dapatkan string dalam bahasa Korea (lihat Gambar 3). Karakter Korea yang digunakan diterjemahkan ke BlackPink:

Sekarang, lihat kode di bawah ini. Kami akan mengekstrak dua karakter yang sesuai dengan Hitam .

-- extract 'black' from BlackPink (Korean)
SELECT SUBSTRING(N'블랙핑크',1,2) AS result

Apakah Anda memperhatikan string Korea yang didahului oleh N ? Ini menggunakan karakter Unicode, dan SQL Server mengasumsikan NVARCHAR dan harus didahului oleh N . Itulah satu-satunya perbedaan dalam versi bahasa Inggris. Tapi apakah itu akan berjalan dengan baik? Lihat Gambar 4:

Itu berjalan tanpa kesalahan.

2. Menggunakan SQL SUBSTRING di MySQL Dengan Argumen Awal Negatif

Memiliki argumen awal yang negatif tidak akan berfungsi di SQL Server. Tapi kita bisa memiliki contoh ini menggunakan MySQL. Kali ini, mari kita ekstrak Pink dari BlackPink . Ini kodenya:

-- Extract 'Pink' from BlackPink using MySQL Substring (English)
select substring('BlackPink',-4,4) as result;

Sekarang, mari kita lihat hasilnya pada Gambar 5:

Karena kami meneruskan -4 ke parameter awal, ekstraksi dimulai dari akhir string, mundur 4 karakter. Untuk mencapai hasil yang sama di SQL Server, gunakan fungsi RIGHT().

Karakter Unicode juga bekerja dengan MySQL SUBSTRING, seperti yang Anda lihat pada Gambar 6:

Ini bekerja dengan baik. Tetapi apakah Anda memperhatikan bahwa kita tidak perlu mendahului string dengan N? Juga, perhatikan bahwa ada beberapa cara untuk mendapatkan substring di MySQL. Anda telah melihat SUBSTRING. Fungsi yang setara di MySQL adalah SUBSTR() dan MID().

3. Mengurai Substring dengan Argumen Awal dan Panjang Variabel

Sayangnya, tidak semua ekstraksi string menggunakan argumen awal dan panjang yang tetap. Dalam kasus seperti itu, Anda memerlukan CHARINDEX untuk mendapatkan posisi string yang Anda targetkan. Mari kita ambil contoh:

DECLARE @lineString NVARCHAR(30) = N'김제니 01/16/[email protected]'
DECLARE @name NVARCHAR(5)
DECLARE @bday DATE
DECLARE @instagram VARCHAR(20)

SET @name = SUBSTRING(@lineString,1,CHARINDEX('@',@lineString)-11)
SET @bday = SUBSTRING(@lineString,CHARINDEX('@',@lineString)-10,10)
SET @instagram = SUBSTRING(@lineString,CHARINDEX('@',@lineString),30)

SELECT @name AS [Name], @bday AS [BirthDate], @instagram AS [InstagramAccount]

Pada kode di atas, Anda perlu mengekstrak nama dalam bahasa Korea, tanggal lahir, dan akun Instagram.

Kita mulai dengan mendefinisikan tiga variabel untuk menampung potongan-potongan informasi tersebut. Setelah itu, kita dapat mengurai string dan menetapkan hasilnya ke setiap variabel.

Anda mungkin berpikir bahwa memiliki awal dan panjang yang tetap lebih sederhana. Selain itu, kita dapat menentukannya dengan menghitung karakter secara manual. Tetapi bagaimana jika Anda memiliki banyak makanan ini di atas meja?

Inilah analisis kami:

  • Satu-satunya item tetap dalam string adalah @ karakter di akun Instagram. Kita bisa mendapatkan posisinya dalam string menggunakan CHARINDEX. Kemudian, kami menggunakan posisi itu untuk mendapatkan awal dan panjang sisanya.
  • Tanggal lahir dalam format tetap menggunakan MM/hh/tttt dengan 10 karakter.
  • Untuk mengekstrak nama, kita mulai dari 1. Karena tanggal lahir memiliki 10 karakter ditambah @ karakter, Anda bisa mendapatkan karakter akhir dari nama dalam string. Dari posisi @ karakter, kita kembali 11 karakter. SUBSTRING(@lineString,1,CHARINDEX('@',@lineString)-11) adalah cara untuk pergi.
  • Untuk mendapatkan tanggal lahir, kami menerapkan logika yang sama. Dapatkan posisi @ karakter dan pindahkan 10 karakter ke belakang untuk mendapatkan nilai awal tanggal lahir. 10 adalah panjang tetap. SUBSTRING(@lineString,CHARINDEX('@',@lineString)-10,10) adalah cara mendapatkan tanggal lahir.
  • Akhirnya, mendapatkan akun Instagram itu mudah. Mulai dari posisi @ karakter menggunakan CHARINDEX. Catatan:30 adalah batas nama pengguna Instagram.

Lihat hasilnya pada Gambar 7:

4. Menggunakan SQL SUBSTRING dalam Pernyataan SELECT

Anda juga dapat menggunakan SUBSTRING dalam pernyataan SELECT, tetapi pertama-tama, kita harus memiliki data yang berfungsi. Ini kodenya:

SELECT
 CAST(P.LastName AS CHAR(50)) 
 + CAST(P.FirstName AS CHAR(50)) 
 + CAST(ISNULL(P.MiddleName,'') AS CHAR(50)) 
 + CAST(ea.EmailAddress AS CHAR(50)) 
 + CAST(a.City AS CHAR(30)) 
 + CAST(a.PostalCode AS CHAR(15)) AS line
INTO PersonContacts
FROM Person.Person p
INNER JOIN Person.EmailAddress ea 
  ON P.BusinessEntityID = ea.BusinessEntityID
INNER JOIN Person.BusinessEntityAddress bea 
  ON P.BusinessEntityID = bea.BusinessEntityID
INNER JOIN Person.Address a 
  ON bea.AddressID = a.AddressID

Kode di atas membuat string panjang yang berisi nama, alamat email, kota, dan kode pos. Kami juga ingin menyimpannya di PersonContacts tabel.

Sekarang, mari kita buat kode untuk merekayasa balik menggunakan SUBSTRING:

SELECT
 TRIM(SUBSTRING(line,1,50)) AS [LastName]
,TRIM(SUBSTRING(line,51,50)) AS [FirstName]
,TRIM(SUBSTRING(line,101,50)) AS [MiddleName]
,TRIM(SUBSTRING(line,151,50)) AS [EmailAddress]
,TRIM(SUBSTRING(line,201,30)) AS [City]
,TRIM(SUBSTRING(line,231,15)) AS [PostalCode]
FROM PersonContacts pc
ORDER BY LastName, FirstName

Karena kami menggunakan kolom ukuran tetap, tidak perlu menggunakan CHARINDEX.

Menggunakan SQL SUBSTRING dalam Klausa WHERE – Jebakan Performa?

Itu benar. Tidak ada yang bisa menghentikan Anda menggunakan SUBSTRING dalam klausa WHERE. Ini adalah sintaks yang valid. Tapi bagaimana jika itu menyebabkan masalah kinerja?

Itu sebabnya kami membuktikannya dengan sebuah contoh dan kemudian mendiskusikan cara memperbaiki masalah ini. Tapi pertama-tama, mari kita siapkan data kita:

USE AdventureWorks
GO

SELECT * INTO SalesOrders FROM Sales.SalesOrderHeader soh

Saya tidak dapat mengacaukan SalesOrderHeader meja, jadi saya membuangnya ke meja lain. Kemudian, saya membuat SalesOrderID di SalesOrders . yang baru tabel sebagai kunci utama.

Sekarang, kami siap untuk kueri. Saya menggunakan dbForge Studio untuk SQL Server dengan Mode Pembuatan Profil Kueri AKTIF untuk menganalisis kueri.

SELECT
 so.SalesOrderID
,so.OrderDate
,so.CustomerID
,so.AccountNumber
FROM SalesOrders so
WHERE SUBSTRING(so.AccountNumber,4,4) = '4030'

Seperti yang Anda lihat, kueri di atas berjalan dengan baik. Sekarang, lihat Diagram Rencana Profil Kueri pada Gambar 8:

Diagram rencana terlihat sederhana, tetapi mari kita periksa properti node Clustered Index Scan. Khususnya, kami membutuhkan Informasi Runtime:

Ilustrasi 9 menunjukkan halaman 785 * 8KB yang dibaca oleh mesin database. Perhatikan juga bahwa Baris Aktual yang Dibaca adalah 31.411. Ini adalah jumlah total baris dalam tabel. Namun, kueri hanya mengembalikan 27.605 Baris Aktual.

Seluruh tabel dibaca menggunakan indeks berkerumun sebagai referensi.

Mengapa?

Masalahnya, SQL Server perlu mengetahui apakah 4030 adalah substring dari nomor Akun. Itu harus membaca dan mengevaluasi setiap catatan. Buang baris yang tidak sama dan kembalikan baris yang kita butuhkan. Itu menyelesaikan pekerjaan tetapi tidak cukup cepat.

Apa yang bisa kita lakukan untuk membuatnya berjalan lebih cepat?

Hindari SUBSTRING pada Klausa WHERE dan Raih Hasil yang Sama Lebih Cepat

Yang kita inginkan sekarang adalah mendapatkan hasil yang sama tanpa menggunakan SUBSTRING pada klausa WHERE. Ikuti langkah-langkah di bawah ini:

  • Ubah tabel dengan menambahkan kolom terhitung dengan SUBSTRING(AccountNumber, 4,4) rumus. Beri nama AccountCategory karena tidak ada istilah yang lebih baik.
  • Buat indeks non-cluster untuk AccountCategory . baru kolom. Sertakan TanggalPesanan , Nomor Akun , dan ID Pelanggan kolom.

Itu dia.

Kami mengubah klausa WHERE dari kueri untuk mengadaptasi AccountCategory . yang baru kolom:

SET STATISTICS IO ON

SELECT
 so.SalesOrderID
,so.OrderDate
,so.CustomerID
,so.AccountNumber
FROM SalesOrders so
WHERE so.AccountCategory = '4030'

SET STATISTICS IO OFF

Tidak ada SUBSTRING dalam klausa WHERE. Sekarang, mari kita periksa Diagram Rencana:

Pemindaian Indeks telah digantikan oleh Pencarian Indeks. Perhatikan juga bahwa SQL Server menggunakan indeks baru pada kolom yang dihitung. Apakah ada juga perubahan dalam pembacaan logis dan pembacaan baris aktual? Lihat Gambar 11

Mengurangi dari 785 menjadi 222 pembacaan logis adalah peningkatan besar, lebih dari tiga kali lebih sedikit daripada pembacaan logis asli. Itu juga meminimalkan Baris Aktual yang Dibaca hanya untuk baris yang kita butuhkan.

Jadi, menggunakan SUBSTRING dalam klausa WHERE tidak baik untuk kinerja, dan itu berlaku untuk fungsi bernilai skalar lainnya yang digunakan dalam klausa WHERE.

Kesimpulan

  • Pengembang tidak dapat menghindari penguraian string. Kebutuhan akan hal itu akan muncul dengan satu atau lain cara.
  • Dalam mengurai string, penting untuk mengetahui informasi di dalam string, posisi setiap bagian informasi, dan ukuran atau panjangnya.
  • Salah satu fungsi parsing adalah SQL SUBSTRING. Hanya perlu string untuk diurai, posisi untuk memulai ekstraksi, dan panjang string untuk mengekstrak.
  • SUBSTRING dapat memiliki perilaku yang berbeda antara rasa SQL seperti SQL Server, MySQL, dan Oracle.
  • Anda dapat menggunakan SUBSTRING dengan string literal dan string dalam kolom tabel.
  • Kami juga menggunakan SUBSTRING dengan karakter Unicode.
  • Menggunakan SUBSTRING atau fungsi bernilai skalar apa pun dalam klausa WHERE dapat mengurangi kinerja kueri. Perbaiki ini dengan kolom terhitung yang diindeks.

Jika menurut Anda postingan ini bermanfaat, bagikan di platform media sosial pilihan Anda, atau bagikan komentar Anda di bawah?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tentukan antara pemantauan berbasis agen versus tanpa agen

  2. Estimasi Kardinalitas untuk Beberapa Predikat

  3. Bersenang-senang dengan kompresi (penyimpanan kolom) di atas meja yang sangat besar – bagian 2

  4. Cara Membuat Dokumen Excel dari Program Java Menggunakan Apache POI

  5. Tutorial PL/SQL :Semua yang Perlu Anda Ketahui Tentang PL/SQL