Kết hợp các cột thuộc tính QGIS


10

Tôi có hai cột trong bảng thuộc tính QGIS của tôi. Cột đầu tiên chứa các giá trị không chứa cột thứ hai và ngược lại. Tôi muốn thêm một trường mới chứa cả hai giá trị từ cột thứ nhất và thứ hai. Tôi nghĩ rằng nó có thể đơn giản như "Giá trị 1 + Giá trị 2) nhưng điều này chỉ mang lại cho tôi kết quả Null . Tất cả các giá trị là chuỗi.

Value 1| Value 2 | New Column
-------------------------
 Bacon |         | Bacon
 Eggs  |         | Eggs
       | Cheese  | Cheese
       | Ham     | Ham  

Nó hơi mơ hồ từ cách diễn đạt câu hỏi nếu bạn muốn ghép nối: "Tôi muốn thêm một trường mới chứa cả hai giá trị từ cột thứ nhất và thứ hai." sẽ chỉ ra sự kết hợp nhưng trong ví dụ của bạn, bạn không có sự xuất hiện của cả hai trường có giá trị. Đó là cái gì
Gabriel C.

@GabrielC. Cả hai cột không có giá trị, bất cứ nơi nào một cột có giá trị thì cột kia sẽ không có giá trị. Tôi hi vọng cái này giúp được.
Dunuts

Câu trả lời:


22

Nhiều toán tử và hàm trong SQL (và do đó biểu thức) trả về NULLnếu một trong các tham số làNULL

Các ví dụ sau đây thể hiện hành vi của các toán tử khác nhau trên một lớp với các cột AB.

"A" + "B"

  • NULL + 'text'NULL
  • 'a' + 'b''ab'

"A" || "B"

  • NULL || 'text'NULL
  • 'a' || 'b''ab'

CONCAT("A", "B")

  • CONCAT(NULL, 'text')'text'
  • CONCAT('a', 'b')'ab'

COALESCE("A", "B")

  • COALESCE(NULL, 'text')'text'
  • COALESCE('a', 'b')'a'
  • COALESCE('a', NULL)'a'
  • COALESCE(NULL, NULL, 'Other')'Other'

Trong trường hợp của bạn, bạn muốn làm việc với một trong hai CONCAThoặc COALESCEtùy thuộc vào hành vi dự kiến ​​có nhiều / không có giá trị.


1
Thật tệ khi đây không phải là câu trả lời được chấp nhận, tôi nghĩ đây là câu trả lời hay nhất vì nó giải thích cách các nhà khai thác khác nhau hành xử, tạo ra vấn đề được đề cập trong OP.
Gabriel C.

15

Bạn có thể sử dụng máy tính trường và làm theo các bước sau:

1- Tạo trường mới (chuỗi)

2- Sử dụng chức năng "kết hợp"

       coalesce(  "Value 1" , "Value 2" , 'value if No data')

Hàm Colaesce trả về đầu tiên không phải NULL

nhập mô tả hình ảnh ở đây


3

Chọn lớp trong bảng điều khiển lớp và mở bảng điều khiển python và chạy đoạn mã này:

layer = iface.activeLayer()
layer.startEditing()
fields = layer.pendingFields()
fieldIndex = fields.indexFromName('newColumn')
for feature in layer.getFeatures():
    if feature['value1']:
        layer.changeAttributeValue(feature.id(),fieldIndex,feature['value1'])
    if feature['value2']:
        layer.changeAttributeValue(feature.id(),fieldIndex,feature['value2'])
    if feature['value1'] and feature['value2']:
        layer.changeAttributeValue(feature.id(),fieldIndex,feature['value2'] + ' ' + feature['value2']) # not sure what you want to do here if values found in both value1 and value2 fields
layer.commitChanges()

2

Bạn cũng có thể sử dụng máy tính trường, thêm trường mới và cung cấp cho anh ta như sau

CASE WHEN "column1" IS NULL
THEN "column2"
ELSE "column1"
END
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.