2014-03-27 67 views
0

輸出下面的SQL語句是 '279A'SUBSTR之間的Teradata

SELECT 
    SUBSTR('H0279A',3) 

我很困惑,爲什麼這個查詢返回1:

 SELECT 
     CASE 
      WHEN SUBSTR('H0279A',3) BETWEEN '0000' AND '9999' 
      THEN 1 
     ELSE 0 
     END 

如何 '279A' 是 '0000' 之間AND'9999'? 我正在使用Teradata。

+0

爲什麼0000用引號引起來?我認爲之間適用於數字和日期。而不是字符串。 – emaillenin

+0

我不能說,因爲我從同事那裏得到了這個代碼... – Adam

回答

4

您的H0279A是varchar類型的。 0000和9999也是如此。所以基本上你是比較字符串而不是數字。 2在0和9之前。所以它難怪279A在0000和9999之間。

你想檢查給定的字符串是否在0和9999之間。那麼你應該這樣做。

SELECT 
    CASE 
     WHEN SUBSTR('H0279A',3) BETWEEN 0 AND 9999 --here 0 and 9999 are numbers, not strings 
      THEN 1 
    ELSE 0 
    END; 

但是這會引發異常,因爲279A轉換爲數字失敗。

更新: 讓我們暫且擱置SUBSTR一段時間。

create table ntest(
    col1 varchar(20) 
    ); 

insert into ntest values('abs'); 
insert into ntest values('abscond'); 
insert into ntest values('000'); 
insert into ntest values('000000A'); 
insert into ntest values('9999'); 
insert into ntest values('027A'); 
insert into ntest values('zip'); 
insert into ntest values('279'); 
insert into ntest values('279A'); 
insert into ntest values('877'); 

select * from ntest order by col1; 

col1 
-------------------- 
000    <--------------------------¬ 
000000A          | 
027A           | 
279           | 
279A -- strings starting with 2 are between strings starting with 0 and 9 
877           | 
9999    <--------------------------⤶ 
abs 
abscond 
zip 
+0

H0279A確實是varchar,因爲它是一個字符代碼。 讓我困惑的是'H0279A'如何在'0000'和'9999'之間......請您詳細說明一下嗎? – Adam

+0

首先要記住的是,您正在比較字符串,而不是數字。當你打開一個單詞排序的字典時,你會首先發現'蘋果',然後'貓'和'動物園'最後。同樣,以'0'開始的任何字符串都將是第一個,'2'將會遲來,'9'將會持續。 – Noel

+0

首先我想我會得到「1」作爲結果,如果SUBSTRING函數之後的字符串的長度是4,即XXXX應該始終在'0000'和'9999'之間。但是,即使字符串長度小於4,查詢也會返回1.此外,我注意到如果字符串長度爲4,並且字符串不是以數字開頭,而是以字母開頭(例如H123),或者字母在前3位(fe 1H23或12H3)結果再次爲0 – Adam