簡體   English   中英

Oracle SQL“meta”查詢具有特定列值的記錄

[英]Oracle SQL “meta” query for records which have specific column values

我想從一個巨大的表中獲取所有記錄,其中任何number列的值都大於0 最好的方法是什么?

例如:

/* table structure*/
create table sometable (id number, 
                        somestring varchar2(12),
                        some_amount_1 number(17,3),
                        some_amount_2 number(17,3),
                        some_amount_3 number(17,3),
                        ...
                        some_amount_xxx number(17,3));
/* "xxx" > 100, and yeah I did not designed that table structure... */

我想要任何some_amount_n > 0 (更好的解決方案是首先添加一個字段來顯示哪個字段大於零)。

我知道我可以用一個巨大的some_amount_1 > 0 OR some_amount_2 > 0 OR ...塊來編寫這個(和某些case when的字段名稱但是應該有一些更優雅的解決方案,不是嗎?

可能的解決方案:

  1. 規范化表格。 你說你不被允許。 嘗試通過解釋好處(性能,編寫查詢的簡易性等)來說服那些禁止這種變化的人。

  2. 寫出巨大丑陋的OR查詢。 您還可以將其與規范化表的查詢版本一起打印。 添加性能測試(我希望你可以創建另一個測試表或數據庫。)

  3. 編寫一個程序(PL / SQL或其他程序語言),產生可怕的OR查詢。 (再次,與優雅版一起打印)

  4. 添加一個新列,稱為Any_x_bigger_than_zero ,它通過觸發器(使用巨大的丑陋OR )自動填充01 然后你只需要檢查: WHERE Test_x_bigger_than_zero = 1以查看是否有任何行> 0

  5. 與之前相似,但更好的是,使用這樣的列創建物化視圖。

首先,創建一個表,將數據排序為更容易讀取的內容......像id,column_name,column_value這樣簡單的東西。 你必須忍受我,因為我在oracle中運行了一段時間,所以這是最重的偽代碼:

快速動態sql blurb ...您可以將變量設置為sql語句,然后執行該變量。 存在一些安全風險,並且可能在您的環境中禁用此功能...因此請確認您可以先運行此功能。 聲明一個變量,將變量設置為'select 1'然后使用'execute immediate'來執行存儲在變量中的sql。

set var = 'select id, ''some_amount_' || 1  || '', some_amount || 1 || ' from table where some_amount_' || 1  || ' <> 0'

假設我的oracle語法正確...(管道是否正確附加?我認為3個單引號為''',如果在變量中也應該導致',你可能需要試用並錯誤這一行,直到你將var設置為):

select id, 'some_amount_1',some_amount_1
from table
where some_amount_1 <> 0

這應該為some_amount_1中的數據庫中的每個id選擇ID和值。 您可以很容易地將其轉換為插入語句。

我假設some_amount_xxx有一個上限......下一個技巧是循環這個巨大的聲明。 再次,可怕的偽代碼:

declare sql_string
declare i and set to 1
for i = 1 to xxx (whatever your xxx is)
set sql_string to the first set var statement we made, replacing the '1' with the i var here.
execute sql
increment i
loop

希望它有意義......它是你想要循環動態sql的極少數場景之一。 現在你有一個相對直接的表來讀取,這應該是一個相對簡單的查詢從這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM