[英]Check if number in varchar2 is greater than n
我有一個Varchar2字段,該字段通常包含兩個字母字符(例如ZH
, SZ
, AI
,...)。 我們稱之為FOO 。
某些數據集將A
或A1
- A9
保存到同一字段中。 我需要選擇除那些行外的所有行。 我使用函數substr
將數字與A分開。 到目前為止, <
或>
似乎不能與“ number-string”一起正常使用。
如何在不將其轉換為數字的情況下實現這一目標? 有沒有更簡單的解決方案?
我沒有在互聯網上找到任何東西,我自己嘗試達到了極限。
到目前為止,這是我的WHERE子句 :
WHERE (substr(FOO, 0, 1) != 'A'
or (substr(FOO, 0, 1) = 'A' AND substr(FOO, 1, 1) > '9'));
它不受限制地返回所有行。
我發現的唯一解決方案:
WHERE (FOO NOT IN ('A', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9'));
但這不是最佳的,如果將來某個地方會有A1
- A50
。 我必須在WHERE子句中添加51個字符串。 而且,由於查詢是在源代碼中進行的,因此代碼的可讀性也會變差。
該解決方案應在ORACLE 和 SQL Server上運行。 提前致謝
(substr(FOO, 0, 1) = (substr(FOO, 1, 1)
-Oracle以1(非0)開始。
因此,您應該使用substr(FOO, 2, 1)
獲得第二個符號。
但是,它不能在具有SUBSTRING(而非SUBSTR)的SQL Server中工作。
如果您准備在不同的數據庫中使用不同的方法,則還可以嘗試使用正則表達式:
甲骨文
where not regexp_like(foo, '^A[1-9]{1,3}$')
^字符串的開頭
$字符串結尾
[1-9] 1到9之間的任何數字
{1,3}重復上一個表達式1,2或3次
匹配/不匹配'^A[1-9]{1,3}$'
a123
的FOO的示例-可能匹配/可能不匹配(取決於有關大小寫敏感性的NLS設置)
A123
匹配(第一個符號為“ A”,其他符號為3位數字)
A123b
不匹配(最后一個符號應該是一個數字)
A1234
不匹配(結尾應為1,2或3位數字)
A12
比賽
A1
比賽
如果您的要求是僅包括'A'以外的所有字母值,請考慮使用LIKE表達式,以便它可與任何符合ANSI的DBMS一起使用:
WHERE FOO <> 'A' AND FOO NOT LIKE '%[^A-Z]%'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.