Sql-Server

我的 CASE 表達式中使用的 MSSQL 的 try_cast 函式是否有 Postgres 解決方法?

  • December 17, 2021

我需要一些幫助/建議。

我在 MSSQL 中有一個查詢作為對 Postgres 連結伺服器的開放查詢;實際上是一個 CASE 語句,在一個允許我檢查列中的值是否可以轉換為“FLOAT”的查詢中,如果不是,則返回“1”。

我需要能夠使用這樣的東西,因為此列(‘OLD_LABEL’)包含使用者輸入的非標準化數據(值範圍從’user’到’North’到NULL到12345到’SET1024’)。因此,要撤回具有特定值的記錄(為了不破壞自動化,我需要從 ‘0’ 到 ‘9999.995’ 的實數),我使用了以下內容:

CASE 
WHEN OLD_LABEL IS NULL THEN ''0''
WHEN try_cast(OLD_LABEL AS FLOAT) IS NULL THEN ''1''
ELSE OLD_LABEL END AS NEW_LABEL

但是,它已移至 Postgres 數據庫,現在我的案例表達式和後續自動化將不起作用(因為 try_cast 是 MSSQL 的內置函式)。我想做的在理論上很簡單 - 但是我對 Postgres 的熟悉程度不足以自己想出一個解決方案

當值在“OLD_LABEL”列中不是可辨識/實數時,我該怎麼說,然後將值設置/替換為“1”

需要注意的是,當“OLD_LABEL”中的現有值不是 0 或 NULL,並且是實際數字時,我需要在“NEW_LABEL”列中保留/使用該數字 - 否則將該值替換為“1”

有沒有辦法做到這一點?此外 - 我只有對 Postgres 數據庫的“讀取”訪問權限,因此任何需要創建表、對數據庫進行功能更改等的事情都超出了我的能力範圍(也無法獲得這樣做的權限,因為我沒有“擁有”我正在查詢的數據庫)- 我確實擁有對我正在執行 openquery 的 MSSQL 數據庫的管理員訪問權限。

如果您熟悉正則表達式,那麼檢查輸入的有效性然後應用您的分類規則是相當簡單的。

分貝小提琴

SELECT old_label,
      CASE WHEN old_label IS NULL THEN '0'
           ELSE COALESCE(
                  substring(old_label from '^ *([0-9]*\.?[0-9]*) *$'),
                  '1'
                )
      END AS new_label
 FROM dodgy;

這種特定的模式匹配允許前導和尾隨空格字元,並且需要一個整數或浮點數,而無需使用科學記數法(因為您指定了一個不需要該複雜性的數字範圍。) substring()如果沒有匹配,則返回 NULL;COALESCE如果有,則返回第一個非 NULL。

如果您想調整模式定義正則表達式文件可能會有所幫助。

引用自:https://dba.stackexchange.com/questions/305086