我有這組字串:
*INBOX_COL
14AF08
14AF09
17NAMX14
17NAMX16
21KMTZ7
21KMTZ8
21KMTZ9
B-09
B-14
假設最后一組數字(7、8、9、14 等)代表大小。
我想得到最后一組數字來確定數量
SELECT CASE WHEN (RIGHT(RTRIM(INBOX_COL),2) > '16' THEN 6 ELSE 12 END QTY
FROM MY_TABLE
但是由于書寫不統一,所以當我取字串的最后兩個字符時,它回傳這樣的內容 = ('08', '8', '09','9', 'Z7', 'Z8') 所以它未能滿足 Select Case 條件。
我想提取這樣的字串:
14AF08 = 8
17NAMX14 = 14
21KMTZ7 = 7
有任何想法嗎?謝謝
uj5u.com熱心網友回復:
reverse()字串- 用于
patindex()查找非數字字符 - 用于
right()提取字符
SELECT RIGHT(INBOX_COL, PATINDEX('%[^0-9]%', REVERSE(INBOX_COL)) - 1)
uj5u.com熱心網友回復:
不是最通用的方法,但如果您知道要查找的最大數字是 999,那么您只需檢查最后 3 個字符,然后將它們分串出來。
select X.INBOX_COL
-- Substring out the number component
-- Cheeky way to ignore dash ('-')
, replace(substring(X.INBOX_COL, Z.StringLength-Z.NumberLength 1, Z.NumberLength),'-','') Quantity
from (
values
('14AF08'),
('14AF09'),
('17NAMX14'),
('17NAMX16'),
('21KMTZ7'),
('21KMTZ8'),
('21KMTZ9'),
('B-09'),
('B-14')
) X (INBOX_COL)
cross apply (
-- Assume max value number is 999, so check last 3 characters of string
values (
isnumeric(case when len(X.INBOX_COL) > 0 then substring(reverse(X.INBOX_COL),1,1) else 'z' end)
, isnumeric(case when len(X.INBOX_COL) > 1 then substring(reverse(X.INBOX_COL),2,1) else 'z' end)
, isnumeric(case when len(X.INBOX_COL) > 2 then substring(reverse(X.INBOX_COL),3,1) else 'z' end)
)
) Y (One, Two, Three)
cross apply (
-- Get the expected length of the number string (and the length of the actual string)
values (
len(X.INBOX_COL), case when One = 1 and Two = 1 and Three = 1 then 3 when One = 1 and Two = 1 then 2 when One = 1 then 1 else 0 end
)
) Z (StringLength, NumberLength);
回傳:
| 收件箱_COL | 數量 |
|---|---|
| 14AF08 | 08 |
| 14AF09 | 09 |
| 17NAMX14 | 14 |
| 17NAMX16 | 16 |
| 21KMTZ7 | 7 |
| 21KMTZ8 | 8 |
| 21KMTZ9 | 9 |
| B-09 | 09 |
| B-14 | 14 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/371560.html
標籤:sql sql-server 查询语句
上一篇:如何比較除一列或兩列之外具有相同列值的行之間的日期?
下一篇:保存列轉換以在SELECT中重用
