PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Quy tắc cho suy luận kiểu `chưa biết` và kiểu là gì?

Thực sự có ba câu hỏi trong đó mà tôi sẽ cố gắng trả lời.

  1. Mục đích của unknown là gì ?

    Đây là kiểu dữ liệu ban đầu được gán cho NULL và chuỗi ký tự trong câu lệnh SQL. Nếu các ký tự như vậy được gán, hãy nhập loại text ngay lập tức, sẽ rất khó để suy ra loại chính xác.

    Ví dụ:bạn muốn myfunc('hello') để gọi myfunc(character varying) , nhưng không có kiểu ẩn nào được truyền từ text ký tự character varying (và nó sẽ gây ra sự mơ hồ nếu bạn đã tạo).

  2. Tại sao SELECT null trả về một cột thuộc loại unknown ?

    Câu trả lời truyền thống là:Bởi vì người dùng không chỉ định loại.

    Tuy nhiên, hành vi này đã có vấn đề. Ví dụ:nếu bạn tạo một bảng như sau:

    CREATE TABLE test
       AS SELECT 'hello';
    

    bạn sẽ kết thúc với một cột thuộc loại unknown , không thể sử dụng được và sẽ gây ra nhiều vấn đề hơn nữa. Loại unknown thực sự không nên để người dùng nhìn thấy, mà là chi tiết triển khai.

    Do đó, cam kết này đã thay đổi hành vi từ PostgreSQL v10 trên:Bây giờ là bất kỳ unknown nào s còn lại trong một SELECT hoặc RETURNING danh sách buộc phải text và không thể tạo bảng với các cột thuộc loại unknown .

  3. Tại sao SELECT NULL UNION SELECT 42 hoạt động, nhưng không hoạt động SELECT NULL UNION SELECT NULL UNION SELECT 42 ?

    Điều này là do quy tắc chuyển đổi loại . UNION được kết hợp trái, vì vậy truy vấn sau này được hiểu là

    (SELECT NULL UNION SELECT NULL) UNION SELECT 42;
    

    Bây giờ là UNION đầu tiên phân giải thành kiểu dữ liệu text vì quy tắc 3:

    Điều này gây ra lỗi khi cố gắng giải quyết loại cho UNION thứ hai vì quy tắc 4:

    Mặt khác, trong truy vấn

    SELECT NULL UNION SELECT 42;
    

    “NULL” có loại unknown và “42” có loại integer (kiểu được chọn cho các ký tự số không có dấu thập phân).

    Quy tắc 5

    không áp dụng ở đây, vì integer không phải là loại ưu tiên trong danh mục của nó (đó sẽ là oiddouble precision ), vì vậy quy tắc 6 được sử dụng:

    Điều này dẫn đến một loại integer .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tính toán sự khác biệt giữa kết quả của hai truy vấn đếm (*) dựa trên 2 bảng trong PostgreSQL

  2. Xóa các đối tượng khỏi truy vấn nếu Không có hoặc Null

  3. Truy vấn dữ liệu trong trường dữ liệu mảng JSON

  4. Cập nhật nhiều giá trị jsonb

  5. Làm cách nào để thêm cột trong bảng bằng cách sử dụng di chuyển laravel 5 mà không làm mất dữ liệu của nó?