จริงๆแล้วฉันเห็นสิ่งต่าง ๆ ที่ใช้ในรายงาน BIRT แบบสอบถามที่ส่งผ่านไปยังรันไทม์ BIRT นั้นมีรูปแบบดังนี้
select a,b,c from t where a = ?
และ '?' จะถูกแทนที่ที่รันไทม์โดยค่าพารามิเตอร์จริงที่เลือกจากกล่องแบบหล่นลง ตัวเลือกในเมนูแบบเลื่อนลงได้รับจาก:
select distinct a from t
union all
select '*' from sysibm.sysdummy1
เพื่อให้คุณได้รับค่าที่เป็นไปได้ทั้งหมดรวมถึง " *
" หากผู้ใช้เลือก "*
" จากช่องแบบเลื่อนลง (หมายถึงควรเลือกค่าทั้งหมดของ a) คุณจะต้องแก้ไขแบบสอบถาม (โดย Javascript) ก่อนเรียกใช้
ตั้งแต่ "?" เป็นพารามิเตอร์ตำแหน่งและต้องอยู่ที่นั่นเพื่อให้สิ่งอื่น ๆ ใช้งานได้จาวาสคริปต์จะปรับเปลี่ยนแบบสอบถามให้เป็น:
select a,b,c from t where ((a = ?) or (1==1))
โดยทั่วไปจะลบผลกระทบของส่วนคำสั่งในขณะที่ยังคงออกจากพารามิเตอร์ตำแหน่งในสถานที่
ฉันยังเห็นกรณีและใช้โดยขี้เกียจ coders ในขณะที่สร้างแบบสอบถาม SQL แบบไดนามิก
สมมติว่าคุณต้องสร้างแบบสอบถามที่เริ่มต้นด้วยselect * from t
และตรวจสอบแบบไดนามิก:
- ชื่อคือบ๊อบ; และ
- เงินเดือนคือ> $ 20,000
บางคนจะเพิ่มคนแรกด้วย WHERE และคนที่ตามมาด้วยและดังนี้:
select * from t where name = 'Bob' and salary > 20000
โปรแกรมเมอร์ขี้เกียจ (และนั่นไม่จำเป็นต้องเป็นลักษณะที่ไม่ดี ) จะไม่แยกความแตกต่างระหว่างเงื่อนไขที่เพิ่มเข้ามาพวกเขาจะเริ่มต้นด้วยselect * from t where 1=1
และเพียงแค่เพิ่มและส่วนคำสั่งหลังจากนั้น
select * from t where 1=1 and name = 'Bob' and salary > 20000