Saya punya bidang tabel membername
yang berisi nama belakang dan nama pengguna. Apakah mungkin untuk membagi mereka menjadi 2 bidang memberfirst
, memberlast
?
Semua catatan memiliki format ini "Firstname Lastname" (tanpa tanda kutip dan spasi di antaranya).
Jawaban:
Sayangnya MySQL tidak menampilkan fungsi string split. Namun Anda dapat membuat fungsi yang ditentukan pengguna untuk ini, seperti yang dijelaskan dalam artikel berikut:
Dengan fungsi itu:
Anda dapat membuat kueri Anda sebagai berikut:
Jika Anda memilih untuk tidak menggunakan fungsi yang ditentukan pengguna dan Anda tidak keberatan kueri menjadi lebih bertele-tele, Anda juga dapat melakukan hal berikut:
sumber
LENGTH
multibyte Anda aman? "LENGTH (str): Mengembalikan panjang string str, diukur dalam byte. Karakter multibyte dihitung sebagai beberapa byte. Ini berarti bahwa untuk string yang berisi lima karakter 2-byte, LENGTH () mengembalikan 10, sedangkan CHAR_LENGTH () mengembalikan 5. "Varian SELECT (tidak membuat fungsi yang ditentukan pengguna):
Pendekatan ini juga menangani:
Versi UPDATE adalah:
sumber
Tampaknya tanggapan yang ada terlalu rumit atau bukan jawaban yang ketat untuk pertanyaan tertentu.
Saya pikir, jawaban sederhana adalah pertanyaan berikut:
Saya pikir tidak perlu berurusan dengan lebih dari dua kata dalam situasi khusus ini. Jika Anda ingin melakukannya dengan benar, pemisahan bisa sangat sulit atau bahkan tidak mungkin dalam beberapa kasus:
Dalam database yang dirancang dengan baik, nama manusia harus disimpan baik di bagian maupun secara keseluruhan. Ini tidak selalu mungkin, tentu saja.
sumber
Jika rencana Anda melakukan ini sebagai bagian dari kueri, tolong jangan lakukan itu (a) . Serius, ini adalah pembunuh kinerja. Mungkin ada situasi di mana Anda tidak peduli dengan kinerja (seperti pekerjaan migrasi satu kali untuk membagi bidang yang memungkinkan kinerja yang lebih baik di masa depan) tetapi, jika Anda melakukan ini secara teratur untuk apa pun selain database mickey-mouse, Anda sedang membuang-buang sumber daya.
Jika Anda pernah menemukan diri Anda harus memproses hanya bagian dari kolom dalam beberapa cara, desain DB Anda cacat. Mungkin baik-baik saja pada buku alamat rumah atau aplikasi resep atau berbagai database kecil lainnya tetapi tidak akan terukur untuk sistem "nyata".
Simpan komponen nama di kolom terpisah. Ini hampir selalu jauh lebih cepat untuk bergabung dengan kolom bersama dengan rangkaian sederhana (ketika Anda membutuhkan nama lengkap) daripada membaginya dengan pencarian karakter.
Jika, karena alasan tertentu Anda tidak dapat membagi bidang, setidaknya masukkan kolom tambahan dan gunakan pemicu sisipan / perbarui untuk mengisinya. Meskipun bukan 3NF, ini akan menjamin bahwa data masih konsisten dan secara besar-besaran akan mempercepat kueri Anda. Anda juga dapat memastikan bahwa kolom tambahan berukuran lebih rendah (dan diindeks jika Anda mencari) pada saat yang sama sehingga tidak harus bermain-main dengan masalah kasus.
Dan, jika Anda bahkan tidak dapat menambahkan kolom dan pemicu, sadari (dan buat klien Anda sadar, jika itu untuk klien) bahwa itu tidak dapat diskalakan.
(a) Tentu saja, jika maksud Anda adalah menggunakan kueri ini untuk memperbaiki skema sehingga nama-nama ditempatkan ke dalam kolom terpisah dalam tabel daripada kueri, saya akan menganggapnya sebagai penggunaan yang valid. Tapi saya tegaskan, melakukannya dalam kueri sebenarnya bukan ide yang bagus.
sumber
Gunakan ini
sumber
Tidak persis menjawab pertanyaan, tetapi dihadapkan dengan masalah yang sama saya akhirnya melakukan ini:
sumber
Di MySQL ini berfungsi opsi ini:
sumber
Satu-satunya kasus di mana Anda mungkin menginginkan fungsi tersebut adalah kueri UPDATE yang akan mengubah tabel Anda untuk menyimpan Nama Depan dan Nama Belakang ke dalam bidang yang terpisah.
Desain database harus mengikuti aturan tertentu, dan Normalisasi Database adalah yang paling penting
sumber
Saya memiliki kolom di mana nama depan dan belakang keduanya berada dalam satu kolom. Nama depan dan belakang dipisahkan oleh koma. Kode di bawah ini berfungsi. TIDAK ada pengecekan / koreksi kesalahan. Hanya sedikit bodoh. Digunakan phpMyAdmin untuk menjalankan pernyataan SQL.
13.2.10 Sintaks Pembaruan
sumber
Ini mengambil smhg dari sini dan singkat dari indeks Terakhir dari substring yang diberikan di MySQL dan menggabungkan mereka. Ini untuk mysql, yang saya butuhkan adalah untuk mendapatkan nama yang layak menjadi first_name last_name dengan nama belakang satu kata, nama pertama semuanya sebelum kata tunggal itu, di mana namanya bisa nol, 1 kata, 2 kata, atau lebih dari 2 kata. Yaitu: Null; Mary; Mary Smith; Mary A. Smith; Mary Sue Ellen Smith;
Jadi, jika nama adalah satu kata atau nol, nama belakang adalah nol. Jika nama adalah> 1 kata, last_name adalah kata terakhir, dan first_name semua kata sebelum kata terakhir.
Perhatikan bahwa saya sudah memangkas hal-hal seperti Joe Smith Jr.; Joe Smith Esq. dan seterusnya, secara manual, yang menyakitkan, tentu saja, tetapi cukup kecil untuk melakukan itu, jadi Anda ingin memastikan untuk benar-benar melihat data di bidang nama sebelum memutuskan metode mana yang akan digunakan.
Perhatikan bahwa ini juga memangkas hasilnya, jadi Anda tidak berakhir dengan spasi di depan atau setelah nama.
Saya hanya memposting ini untuk orang lain yang mungkin google jalan di sini mencari apa yang saya butuhkan. Ini berfungsi, tentu saja, mengujinya dengan pilih dulu.
Ini masalah satu kali, jadi saya tidak peduli efisiensi.
sumber
Metode yang saya gunakan untuk membagi first_name menjadi first_name dan last_name ketika data tiba semua di bidang first_name. Ini hanya akan menempatkan kata terakhir di bidang nama belakang, jadi "john phillips sousa" akan menjadi "john phillips" nama depan dan "sousa" nama belakang. Itu juga menghindari menimpa catatan yang sudah diperbaiki.
sumber
sumber
mysql 5.4 menyediakan fungsi pemisahan asli:
sumber