อ้างถึง:
ฉันได้ลองใช้คำสั่งด้านล่างนี้เพื่อค้นหาคอลัมน์ที่เหมาะสมตามสิ่งที่ฉันคิดว่าควรตั้งชื่อ แต่กลับไม่มีผลลัพธ์ *
SELECT * from dba_objects WHERE
object_name like '%DTN%'
คอลัมน์ไม่ใช่วัตถุ หากคุณหมายความว่าคุณคาดว่าชื่อคอลัมน์จะเป็นเหมือน '% DTN%' คำค้นหาที่คุณต้องการคือ:
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
แต่ถ้าสตริง 'DTN' เป็นเพียงการคาดเดาในส่วนของคุณนั่นอาจไม่ช่วยอะไรได้
คุณแน่ใจได้อย่างไรว่า '1/22 / 2008P09RR8' เป็นค่าที่เลือกโดยตรงจากคอลัมน์เดียว ถ้าคุณไม่รู้เลยว่ามันมาจากไหนมันอาจเป็นการต่อกันของหลายคอลัมน์หรือผลลัพธ์ของฟังก์ชันบางอย่างหรือค่าที่อยู่ในวัตถุตารางที่ซ้อนกัน ดังนั้นคุณอาจกำลังไล่ล่าห่านป่าโดยพยายามตรวจสอบค่านั้นทุกคอลัมน์ คุณไม่สามารถเริ่มต้นด้วยแอปพลิเคชันไคลเอนต์ใด ๆ ที่แสดงค่านี้และพยายามหาคำค้นหาที่ใช้เพื่อรับมันได้หรือไม่?
อย่างไรก็ตามคำตอบของ diciu ให้วิธีการหนึ่งในการสร้างแบบสอบถาม SQL เพื่อตรวจสอบทุกคอลัมน์ของทุกตารางเพื่อหาค่า คุณยังสามารถทำสิ่งที่คล้ายกันทั้งหมดในเซสชัน SQL เดียวโดยใช้บล็อก PL / SQL และไดนามิก SQL นี่คือโค้ดที่เขียนขึ้นอย่างเร่งรีบสำหรับสิ่งนั้น:
SET SERVEROUTPUT ON SIZE 100000
DECLARE
match_count INTEGER;
BEGIN
FOR t IN (SELECT owner, table_name, column_name
FROM all_tab_columns
WHERE owner <> 'SYS' and data_type LIKE '%CHAR%') LOOP
EXECUTE IMMEDIATE
'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
' WHERE '||t.column_name||' = :1'
INTO match_count
USING '1/22/2008P09RR8';
IF match_count > 0 THEN
dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
END IF;
END LOOP;
END;
/
มีบางวิธีที่คุณสามารถทำให้มีประสิทธิภาพมากขึ้นได้เช่นกัน
ในกรณีนี้จากค่าที่คุณต้องการคุณสามารถกำจัดคอลัมน์ใด ๆ ที่เป็นประเภท NUMBER หรือ DATE ได้อย่างชัดเจนซึ่งจะช่วยลดจำนวนการสืบค้น อาจจะ จำกัด เฉพาะคอลัมน์ที่ประเภทเป็น '% CHAR%'
แทนที่จะสร้างหนึ่งแบบสอบถามต่อคอลัมน์คุณสามารถสร้างหนึ่งแบบสอบถามต่อตารางดังนี้:
SELECT * FROM table1
WHERE column1 = 'value'
OR column2 = 'value'
OR column3 = 'value'
...
;