Cách phân tách các giá trị được phân tách bằng dấu phẩy thành các cột trong mysql?

Giả sử bạn có một bảng và một cột của bảng này chứa các giá trị chuỗi được phân tách bằng dấu phẩy và bạn được yêu cầu chia các giá trị chuỗi được phân tách bằng dấu phẩy này thành các cột riêng biệt, nghĩa là nếu chuỗi bao gồm năm giá trị chuỗi con được phân tách bằng dấu phẩy thì bạn phải

Hãy tạo một bảng mẫu có tên PhoneNumberList và chèn một số bản ghi vào bảng này như hình bên dưới

TẠO BẢNG dbo. PhoneNumberList
[EmpId INT IDENTITY[1,1],
EmpPhoneNo VARCHAR[100]
]

CHÈN VÀO dbo. Danh sách số điện thoại
[EmpPhoneNo]
GIÁ TRỊ
['7898798797,8989893333,1212121213,4545454545'],
[‘1313131345,4567676767’],
[‘4746464646,9898989898,8900000000,3434343434’],
[‘7878787878’]

Như bạn có thể thấy bảng mẫu bên dưới có tên  EmpPhone

Bây giờ yêu cầu là bạn phải chia các số điện thoại được phân tách bằng dấu phẩy này thành các cột

Bạn có thể thấy số điện thoại tối đa mà bất kỳ nhân viên nào có là bốn, vì vậy, bạn sẽ có tối đa bốn cột được sử dụng để chia danh sách số điện thoại được phân tách bằng dấu phẩy thành các cột này như minh họa trong đầu ra mẫu bên dưới mà bạn cần triển khai

Đố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 -

Ví 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 -

Ví 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 -

Ví 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 -

Ví 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]

Dựa trên câu trả lời của @ Oleksiy, đây là câu trả lời có thể hoạt động với các chuỗi có độ dài phân đoạn thay đổi [trong giới hạn hợp lý], ví dụ: các địa chỉ được phân tách bằng dấu phẩy

SELECT substring_index [ substring_index [ address,',',1 ], ',', -1] AS address_line_1,
   IF[address_parts > 1, substring_index [ substring_index [ address,',',2 ], ',', -1], ''] AS address_line_2,
   IF[address_parts > 2, substring_index [ substring_index [ address,',',3 ], ',', -1], ''] AS address_line_3,
   IF[address_parts > 3, substring_index [ substring_index [ address,',',4 ], ',', -1], ''] AS address_line_4,
   IF[address_parts > 4, substring_index [ substring_index [ address,',',5 ], ',', -1], ''] AS address_line_5
FROM [
    SELECT address, LENGTH[address] - LENGTH[REPLACE[address, ',', '']] AS address_parts
      FROM mytable
] AS addresses

Đá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ừ

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'];
0

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ề.

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 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ách

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

Các đị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'];

Dung dịch

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ẩy

Vớ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ái

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
3

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 chữ viết tắt của tiểu bang

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
5

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

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
6

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ại

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'];
6 trả về địa chỉ đầy đủ

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
9

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] sai

mysql> select *from demo79;
1

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ệ

mysql> select *from demo79;
2

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ường

Tì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ỉ mục 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
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
30

Cách tách dấu phẩy

Cách tách văn bản được phân tách bằng dấu phẩy [danh sách ID] trong thủ tục lưu trữ MySQL để sử dụng kết quả trong câu lệnh SQL "IN". CHỌN * TỪ bảng WHERE bảng. id IN [splitStringFunction[dấu phẩySeparatedData, ',']]; sql.

Làm cách nào để phân chia các giá trị cột trong MySQL?

Khái niệm MySQL Split xuất hiện nếu bạn định tách chuỗi. Trong MySQL, chúng tôi sử dụng SUBSTRING_INDEX[] để tách chuỗi . Nó thường bao gồm ba đối số tôi. e. , chuỗi, dấu phân cách và vị trí. Giá trị chuỗi sẽ được phân chia dựa trên vị trí.

Làm cách nào để lấy các giá trị cột được phân tách bằng dấu phẩy trong SQL?

Cách nhận các giá trị cột trong một giá trị được phân tách bằng dấu phẩy trong một cột khác .
TỪ #PStatus b
TRÁI THAM GIA chương trình p BẬT p. lập trình = b. chương trình
TRÁI THAM GIA loại hỗ trợ tại BẬT tại. hỗ trợ = b. trợ giúp
tham gia trái pat pt trên b. pattid = pt. bánh bao
Ở ĐÂU 1=1
Sắp xếp theo InactiveType

Làm cách nào để lấy giá trị từ chuỗi được phân tách bằng dấu phẩy trong MySQL?

MySQL có một hàm chuyên dụng FIND_IN_SET[] 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ỉ mục dựa trên một giá trị C trong chuỗi A,B,C,D. Nếu không tìm thấy giá trị đã cho, hàm FIND_IN_SET[] trả về 0.

Chủ Đề