在 Oracle (PL)SQL 中,我目前有一個帶有鍵值對的表。并且需要按不同的條件進行搜索(例如小于或包含)
我目前正在嘗試有條件地(正則運算式)更改我的 where 條件中的列的資料型別,以便我能夠對數字資料型別使用小于 < 條件。我猜的問題是,sql 對此感到困惑,因為在某些情況下它需要比較一個字串,而在其他情況下需要比較一個數字。
在我的表中,我知道每個具有 attr_id 的元素(基本上是一個組)11 是一個字串,8 是一個iso-date,6 是一個數字(如果有辦法利用它)
桌子:
CREATE TABLE attr_value (id, attr_id, value) AS
SELECT 1, 11, 'abc' FROM DUAL UNION ALL
SELECT 2, 11, 'test123' FROM DUAL UNION ALL
SELECT 3, 6, '123' FROM DUAL UNION ALL
SELECT 4, 8, '2021-12-15' FROM DUAL UNION ALL
SELECT 5, 6, '789' FROM DUAL;
選擇:
SELECT
*
FROM
attr_value av
WHERE av.attr_id = 6
AND CASE WHEN REGEXP_LIKE(av.VALUE, '^[- ]?[0-9] $')
THEN CAST(av.VALUE AS NUMBER)
ELSE av.VALUE
END < 250
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=9dae1841bd9d7e993fc53b7992e97149
提前致謝
uj5u.com熱心網友回復:
如果您需要斷言一個過濾器在另一個之前應用,最簡單的方法是使用兩個不同的范圍(依賴于撰寫它們的順序將不起作用,因為 SQL 是宣告性的而不是命令性的)。第一個范圍限制為屬性 6,第二個范圍限制為低于 250 的值。
這意味著使用子查詢。
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=73e2fe1f5ea0d5dae4e78c725db38c2c
SELECT
*
FROM
(
SELECT * FROM attr_value WHERE attr_id = 6
)
av
WHERE
CAST(av.VALUE AS NUMBER) < 250
uj5u.com熱心網友回復:
雖然您不能在 SQL 中動態更改型別,但從 12.2 版開始,您可以DEFAULT NULL ON CONVERSION ERROR用來忽略錯誤:
SELECT
*
FROM
attr_value av
WHERE av.attr_id = 6
AND TO_NUMBER(value DEFAULT NULL ON CONVERSION ERROR) < 250;
但是您仍然希望每個程式員都記得每次都這樣做。并且您必須希望您沒有遇到奇怪的決議錯誤的配置ON CONVERSION ERROR。
更持久的解決方案是更改您的資料模型以將每個值存盤為其本機型別。正如我在解釋這個答案,它更簡單,更安全,更快地改變一個VALUE列到三列或多列像NUMBER_VALUE,STRING_VALUE和DATE_VALUE。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/385723.html
