Đối với điều này, bạn có thể sử dụng substring_index[] trong MySQL. Hãy để chúng tôi tạo một bảng -
Thí dụ
mysql> create table demo79 -> [ -> fullname varchar[50] -> ]; Query OK, 0 rows affected [0.64
Chèn một số bản ghi vào bảng với sự trợ giúp của lệnh chèn -
Thí dụ
mysql> insert into demo79 values["John,Smith"]; Query OK, 1 row affected [0.09 mysql> insert into demo79 values["David,Miller"]; Query OK, 1 row affected [0.11 mysql> insert into demo79 values["Chris,Brown"]; Query OK, 1 row affected [0.07
Hiển thị các bản ghi từ bảng bằng câu lệnh select -
Thí dụ
mysql> select *from demo79;
Điều này sẽ tạo ra đầu ra sau -
đầu ra
+--------------+ | fullname |+--------------+
| John,Smith || David,Miller |
| Chris,Brown |+--------------+
3 rows in set [0.00 sec]
Sau đây là truy vấn để tách một cột thành 2 cột bằng cách sử dụng dấu phẩy làm dấu phân tách -
Thí dụ
mysql> select -> fullname, -> substring_index[fullname, ',', 1] First_Name, -> substring_index[fullname, ',', -1] Last_Name -> from demo79;
Điều này sẽ tạo ra đầu ra sau -
đầu ra
| fullname | First_Name | Last_Name |
+--------------+------------+-----------+| John,Smith | John | Smith |
| David,Miller | David | Miller || Chris,Brown | Chris | Brown |
+--------------+------------+-----------+3 rows in set [0.00 sec]
Tôi đã phân tích cú pháp dữ liệu có dấu gạch nối trong đó. Ví dụ dưới đây sử dụng một chuỗi văn bản cố định để minh họa, chỉ cần thay đổi các tham chiếu thành các tên cột có liên quan trong bảng. Tôi đã chơi lâu năm với một cách để đảm bảo nó hoạt động trên các mã có số lượng thành phần khác nhau và cuối cùng đã quyết định thêm mệnh đề where. Hầu hết dữ liệu bạn đang cố phân tích sẽ có một số cột cố định
select
SUBSTRING_INDEX[TS,"-",1] as "1",
reverse[left[reverse[SUBSTRING_INDEX[TS,"-",2]],locate["-",reverse[SUBSTRING_INDEX[TS,"-",2]]]-1]] as "2",
reverse[left[reverse[SUBSTRING_INDEX[TS,"-",3]],locate["-",reverse[SUBSTRING_INDEX[TS,"-",3]]]-1]] as "3",
reverse[left[reverse[SUBSTRING_INDEX[TS,"-",4]],locate["-",reverse[SUBSTRING_INDEX[TS,"-",4]]]-1]] as "4",
reverse[left[reverse[SUBSTRING_INDEX[TS,"-",5]],locate["-",reverse[SUBSTRING_INDEX[TS,"-",5]]]-1]] as "5",
reverse[left[reverse[SUBSTRING_INDEX[TS,"-",6]],locate["-",reverse[SUBSTRING_INDEX[TS,"-",6]]]-1]] as "6",reverse[left[reverse[SUBSTRING_INDEX[TS,"-",7]],locate["-",reverse[SUBSTRING_INDEX[TS,"-",7]]]-1]] as "7",
reverse[left[reverse[SUBSTRING_INDEX[TS,"-",8]],locate["-",reverse[SUBSTRING_INDEX[TS,"-",8]]]-1]] as "8",
reverse[left[reverse[SUBSTRING_INDEX[TS,"-",9]],locate["-",reverse[SUBSTRING_INDEX[TS,"-",9]]]-1]] as "9",
reverse[left[reverse[SUBSTRING_INDEX[TS,"-",10]],locate["-",reverse[SUBSTRING_INDEX[TS,"-",10]]]-1]] as "10"
from [select "aaa-bbb-ccc-ddd-eee-fff-ggg-hhh-iii-jjj" as TS] as S
where [LENGTH[TS]-LENGTH[REPLACE[TS,'-','']]] =9
Đáng ngạc nhiên là MySQL không có chức năng dành riêng cho hoạt động này trái ngược với split_part trong PostgreSQL. May mắn thay, nó có chức năng thực hiện hầu hết những gì chúng ta cần
Từ
0CREATE TABLE employees [ id SERIAL, name VARCHAR[255], address TEXT, PRIMARY KEY [id] ]; INSERT INTO employees [id, name, address] VALUES [1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'], [2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
Trả về chuỗi con từ chuỗi str trước khi đếm số lần xuất hiện của dấu phân cách. Nếu số đếm là dương, mọi thứ ở bên trái của dấu phân cách cuối cùng [đếm từ bên trái] được trả về. Nếu số đếm là âm, mọi thứ ở bên phải của dấu phân cách cuối cùng [đếm từ bên phải] được trả về.
1 thực hiện khớp phân biệt chữ hoa chữ thường khi tìm kiếm dấu phân cáchCREATE TABLE employees [ id SERIAL, name VARCHAR[255], address TEXT, PRIMARY KEY [id] ]; INSERT INTO employees [id, name, address] VALUES [1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'], [2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
mysql> SELECT SUBSTRING_INDEX['www.mysql.com', '.', 2]; -> 'www.mysql' mysql> SELECT SUBSTRING_INDEX['www.mysql.com', '.', -2]; -> 'mysql.com'Chức năng này an toàn cho nhiều byte
Định nghĩa
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
Giải pháp
Giả sử chúng tôi muốn tìm tất cả nhân viên làm việc ở một tiểu bang nhất định [ví dụ:
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
2], đây là trường thứ tư trong cột chứa địa chỉ dưới dạng các giá trị được phân tách bằng dấu phẩyVới chức năng
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
3, chúng tôi sẽ có thể trích xuất mọi thứ cho đến cột thứ tư chứa trạng tháiSELECT SUBSTRING_INDEX[address, ',', 4] FROM employees;
+-----------+------------------------------------+
| name | SUBSTRING_INDEX[address, ',', 4] |
+-----------+------------------------------------+
| John Doe | 4225 Collins Street,Apt. A,Erie,PA |
| Bob Smith | 234 Main Street,,Erie,PA |
+-----------+------------------------------------+
Bây giờ chúng ta biết rằng trạng thái sẽ luôn là trường cuối cùng trong giá trị kết quả. Vì hàm
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
1 cho phép sử dụng các giá trị âm để trích xuất các trường đếm từ bên phải nên chúng tôi sẽ sử dụng khả năng này để trích xuất trường ngoài cùng bên phải có chứa tên viết tắt của tiểu bangSELECT name, SUBSTRING_INDEX[SUBSTRING_INDEX[address, ',', 4], ',', -1] AS state FROM employees;
+-----------+-------+
| name | state |
+-----------+-------+
| John Doe | PA |
| Bob Smith | PA |
+-----------+-------+
Giải pháp cuối cùng để tất cả nhân viên làm việc ở một trạng thái nhất định được hiển thị bên dưới
SELECT name FROM employees WHERE SUBSTRING_INDEX[SUBSTRING_INDEX[address, ',', 4], ',', -1]='PA';
+-----------+
| name |
+-----------+
| John Doe |
| Bob Smith |
+-----------+
Hãy cẩn thận
Một điều cần lưu ý về
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
1 là hàm trả về toàn bộ chuỗi nếu trường được yêu cầu không tồn tạiVí dụ,
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
6 trả về địa chỉ đầy đủSELECT name, SUBSTRING_INDEX[address, ',', 6] FROM employees;
+-----------+------------------------------------------+
| name | SUBSTRING_INDEX[address, ',', 6] |
+-----------+------------------------------------------+
| John Doe | 4225 Collins Street,Apt. A,Erie,PA,16510 |
| Bob Smith | 234 Main Street,,Erie,PA,16510 |
+-----------+------------------------------------------+
Sau đó, cố gắng trích xuất trường thứ sáu bằng
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
7 sẽ cung cấp cho chúng tôi mã zip [trường thứ năm] saiSELECT name, SUBSTRING_INDEX[SUBSTRING_INDEX[address, ',', 6], ',', -1] AS country FROM employees;
+-----------+---------+
| name | country |
+-----------+---------+
| John Doe | 16510 |
| Bob Smith | 16510 |
+-----------+---------+
Một cách giải quyết khả thi cho vấn đề này là kiểm tra xem số lượng trường có lớn hơn hoặc bằng chỉ mục được yêu cầu hay không và sau đó nhập mã ở trên hoặc trả về chuỗi trống nếu chỉ mục trường không hợp lệ
SELECT
name,
IF[
LENGTH[address] - LENGTH[REPLACE[address, ',', '']] + 1 >= 6,
SUBSTRING_INDEX[SUBSTRING_INDEX[address, ',', 6], ',', -1],
''
] AS country
FROM employees;
+-----------+---------+
| name | country |
+-----------+---------+
| John Doe | |
| Bob Smith | |
+-----------+---------+
sử dụng có thể
Trong hầu hết các trường hợp, tốt hơn là sử dụng một bảng tra cứu riêng biệt hoặc một cột cho từng trường thay vì lưu trữ dữ liệu dưới dạng các giá trị được phân tách bằng dấu phẩy để tra cứu sau này
Tuy nhiên, có thể có những trường hợp hiếm hoi mà thủ thuật trên có thể hữu ích. Ví dụ: gần đây tôi cần trả về một danh sách các giá trị từ hàm do người dùng xác định và cách duy nhất để làm điều đó là trả về một chuỗi chứa các giá trị được phân tách bằng dấu phẩy. Cuối cùng tôi đã sử dụng
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
1 để sắp xếp kết quả theo một trong các trườngTìm kiếm trong cột chứa các giá trị được phân tách bằng dấu phẩy
MySQL có một chức năng chuyên dụng trả về chỉ mục trường nếu giá trị được tìm thấy trong một chuỗi chứa các giá trị được phân tách bằng dấu phẩy
Ví dụ: câu lệnh sau trả về chỉ số dựa trên một giá trị
CREATE TABLE employees [
id SERIAL,
name VARCHAR[255],
address TEXT,
PRIMARY KEY [id]
];
INSERT INTO employees [id, name, address] VALUES
[1, 'John Doe', '4225 Collins Street,Apt. A,Erie,PA,16510'],
[2, 'Bob Smith', '234 Main Street,,Erie,PA,16512'];
9 trong chuỗi SELECT SUBSTRING_INDEX[address, ',', 4] FROM employees;
+-----------+------------------------------------+
| name | SUBSTRING_INDEX[address, ',', 4] |
+-----------+------------------------------------+
| John Doe | 4225 Collins Street,Apt. A,Erie,PA |
| Bob Smith | 234 Main Street,,Erie,PA |
+-----------+------------------------------------+
0