Hàm siêu dữ liệu MySQL để lấy loại cột dự kiến ​​trong truy vấn?


7

Có thể lấy loại trường từ truy vấn MySQL , giống như cách bạn có thể lấy nó từ một bảng bằng SHOW COLUMNSlệnh? Chẳng hạn như từ một bảng dẫn xuất,

SELECT x -- presumedMetaFn(x) -- returns "int"
FROM (
  SELECT 1 AS x
  UNION SELECT 2
) AS t;

Đưa ra truy vấn trên, có một chức năng hoặc một cái gì đó mà tôi có thể sử dụng để có được loại x? PostgreSQL cung cấp tính năng này với Chức năng thông tin hệ thốngpg_typeof

SELECT x, pg_typeof(x)
FROM ( VALUES (1),(2) ) AS t(x);
 x | pg_typeof 
---+-----------
 1 | integer
 2 | integer
(2 rows)

Tôi không tìm kiếm siêu dữ liệu trên một bảng, nhưng từ kết quả của truy vấn. Với psqlPostgreSQL 11+, điều này cũng có thể bằng cách chạy \gdescsau truy vấn.


Tôi rất khuyên bạn nên chọn câu trả lời này: dba.stackexchange.com/a/62262/2639 (đó là cách duy nhất để làm điều đó trong khách hàng chính thức) hoặc dba.stackexchange.com/a/203927/2639 (mà giải quyết API C). Câu trả lời được chọn, chỉ giải quyết các ràng buộc Perl từ quan điểm của người dùng dường như lạc đề ở đây.
Evan Carroll

Câu trả lời:


11

Trong MySQL, bạn có thể lấy thông tin này bằng cách tạo một bảng tạm thời, sau đó sử dụng DESCRIBEtrên bảng tạm thời đó:

CREATE TEMPORARY TABLE `temp`
SELECT ...
FROM ...
LIMIT 0;

DESCRIBE `temp`;

Chúng ta không thể chỉ sử dụng DESCRIBEtrên bảng gốc vì cột chúng ta muốn biết loại là cột được tính, không phải thứ được lấy trực tiếp từ bảng. Tương tự như vậy, chúng ta không thể sử dụng DESCRIBEtrực tiếp trên truy vấn, vì DESCRIBEchỉ có thể được sử dụng trên các bảng. Tạo một bảng tạm thời giải quyết cả hai vấn đề đó.


Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn.
Trưởng Chiu

3

Không có cách nào có thể so sánh để trao một truy vấn cho MySQL và yêu cầu nó trả về một tập kết quả có chứa tên và thuộc tính của các cột mà truy vấn của bạn sẽ trả về khi nó được thực thi.

Tuy nhiên, thư viện bạn đang sử dụng để truy cập MySQL có thể có một cơ chế mà mã của bạn có thể sử dụng ... bởi vì trên dây, MySQL sẽ trả lại thông tin này cho khách hàng với mỗi truy vấn được thực hiện.

Ví dụ, thư viện DBD :: mysql trong Perl trả về các mảng của tên cột và kiểu dữ liệu.

Một câu lệnh xử lý được thực thi trả về một mảng các tên cột trong @ {$ sth -> {NAME}} và mảng các kiểu dữ liệu cột trong @ {$ sth -> {mysql_type_name}}. Nó nhận được những thứ này từ các chức năng được cung cấp bởi API C của MySQL, mà (theo như tôi biết) là cùng một mã cơ bản được sử dụng bởi nhiều ngôn ngữ khác nhau cho các thư viện MySQL của họ ... vì vậy tôi hy vọng các cấu trúc tương tự sẽ được hiển thị trong các cấu trúc khác môi trường.



0

Tôi tin rằng dữ liệu này có sẵn thông qua API C và được ghi lại trong Mã loại tuyên bố chuẩn bị API C nhưng máy chủ không có khả năng cung cấp dữ liệu đó cho người dùng cuối,

Thành viên đệm_type của các MYSQL_BINDcấu trúc biểu thị kiểu dữ liệu của biến ngôn ngữ C được liên kết với một tham số câu lệnh hoặc cột tập kết quả. Đối với đầu vào, buffer_typecho biết loại biến chứa giá trị được gửi đến máy chủ. Đối với đầu ra, nó chỉ ra loại biến mà giá trị nhận được từ máy chủ sẽ được lưu trữ.

Để biết bảng các loại SQL và buffer_typegiá trị tương ứng, hãy xem biểu đồ này.

Công việc duy nhất là CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE


-1

Câu hỏi, khi tôi đọc nó là về việc lấy chi tiết về các cột trong tập kết quả, trái ngược với các cột của bảng cơ sở dữ liệu.

Nếu bạn đang sử dụng PHP, có các hàm dựng sẵn để truy cập cơ sở dữ liệu với MYSQLI và PDO có thể cung cấp cho bạn thông tin chi tiết (loại dữ liệu và vv) về các cột trong kết quả truy vấn (trái ngược với các cột của bảng gốc) .

Để biết chi tiết về các phương thức này, xem tài liệu PHP:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.