การรวมคอลัมน์ตารางคุณสมบัติ QGIS


10

ฉันมีสองคอลัมน์ในตารางคุณสมบัติ QGIS ของฉัน คอลัมน์แรกมีค่าที่ไม่มีคอลัมน์ที่สองและในทางกลับกัน ฉันต้องการเพิ่มเขตข้อมูลใหม่ที่มีทั้งค่าจากคอลัมน์แรกและคอลัมน์ที่สอง ฉันคิดว่ามันอาจจะง่ายเหมือน "Value 1 + Value 2) แต่นี่ให้ผลลัพธ์Nullให้ฉันค่าทั้งหมดเป็นสตริง

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

มันคลุมเครือเล็กน้อยจากถ้อยคำของคำถามหากคุณต้องการต่อกัน: "ฉันต้องการเพิ่มเขตข้อมูลใหม่ที่มีทั้งค่าจากคอลัมน์แรกและคอลัมน์ที่สอง" จะบ่งบอกถึงการต่อข้อมูล แต่ในตัวอย่างของคุณคุณไม่มีทั้งสองฟิลด์ที่มีค่า มันคืออะไร
Gabriel C.

@GabrielC คอลัมน์ทั้งสองไม่มีค่าไม่ว่าคอลัมน์ใดคอลัมน์หนึ่งจะมีค่าอีกคอลัมน์หนึ่งจะไม่มีค่า ฉันหวังว่านี่จะช่วยได้.
Dunuts

คำตอบ:


22

ตัวดำเนินการและฟังก์ชันจำนวนมากใน SQL (และดังนั้นนิพจน์) จะส่งคืนNULLถ้าพารามิเตอร์ตัวใดตัวหนึ่งเป็นNULL

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงพฤติกรรมของผู้ประกอบการต่างๆในชั้นที่มีคอลัมน์ที่และ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'

ในกรณีของคุณคุณต้องการทำงานอย่างใดอย่างหนึ่งCONCATหรือCOALESCEขึ้นอยู่กับพฤติกรรมที่คาดหวังด้วยหลายค่า / ไม่มี


1
มันแย่มากที่นี่ไม่ใช่คำตอบที่ยอมรับได้ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดเพราะอธิบายว่าผู้ปฏิบัติงานต่างกันทำงานอย่างไรสร้างปัญหาที่กล่าวถึงใน OP
Gabriel C.

15

คุณสามารถใช้เครื่องคำนวณภาคสนามและทำตามขั้นตอนเหล่านี้:

1- สร้างฟิลด์ใหม่ (สตริง)

2- ใช้ฟังก์ชั่น "รวม"

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

ฟังก์ชัน Colaesce ส่งคืนแรกไม่ใช่ NULL

ป้อนคำอธิบายรูปภาพที่นี่


3

เลือกเลเยอร์ในแผงเลเยอร์แล้วเปิดคอนโซลไพ ธ อนและเรียกใช้ตัวอย่างนี้:

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

คุณยังสามารถใช้เครื่องคิดเลขภาคสนามเพิ่มสนามใหม่และให้อาหารเขาดังต่อไปนี้

CASE WHEN "column1" IS NULL
THEN "column2"
ELSE "column1"
END
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.