2012-10-25 27 views
0

我有一個表命名參數看起來像這樣:甲骨文,無法從同一列中獲取信息

ID - number 
NAME - varchar2 
VALUE - varchar2 

我有這個疑問女巫「提取」字符串中的日期:

SELECT * from PARAMETER 
where (NAME = 'From') and SUBSTR(VALUE, 1, 2)>='01' 
and SUBSTR(ALUE, -7, 5)>='11' and SUBSTR(VALUE, -4, 4) >='2012' 

現在,我需要重新運行它只是改變:where (NAME = 'From')where (NAME = 'To')

,並比較結果。我找不到辦法做到這一點。有一個竅門嗎?

+1

首先,我認爲你正在試圖比較字符串,就好像它們是日期或數字一樣。 > =運算符僅考慮字符串的長度而不考慮其數值。 例如001> 99是真的,即使它們是數字(整數)也是假的。 我覺得第一個訣竅就是那個。 並且我也沒有得到你想從你的SUBSTR操作中獲得的東西。 Substr(字符串,起始點,長度)。您期望從SUBSTR獲得什麼(VALUE,-4,4) 最後但並非最不重要的是:向我們提供VALUE列的樣本值。 –

+0

這是VALUE列中的內容:29/11/2012 – Slim

+1

好的,並請解釋您想要通過查詢獲得什麼。用我的意思來說就是。例如:我想從01/11/2012查找所有開始的條目(即姓名='發件人'),並於2012年11月20日結束(即姓名='收件人') –

回答

1
Select * From Parameter 
Where Name='From' 
AND TO_DATE(VALUE, 'DD/MM/YYYY') >= TO_DATE('01/11/2012', 'DD/MM/YYYY') 
AND TO_DATE(VALUE, 'DD/MM/YYYY') <= TO_DATE('20/11/2012', 'DD/MM/YYYY') 
UNION 
Select * From Parameter 
Where Name='To' 
AND TO_DATE(VALUE, 'DD/MM/YYYY') >= TO_DATE('01/11/2012', 'DD/MM/YYYY') 
AND TO_DATE(VALUE, 'DD/MM/YYYY') <= TO_DATE('20/11/2012', 'DD/MM/YYYY') 

這會給你,從2012年1月11日開始,直至20/11/2012 ,在這一時期結束以及所有日期和所有的日期。 我不知道這是你要求什麼。

+0

巨大的感謝!它似乎工作!:) – Slim

1

你必須查詢該表兩次,兩子查詢的結果比較,例如:

with v_from as (
    SELECT * from PARAMETER 
    where (NAME = 'From') and SUBSTR(VALUE, 1, 2)>='01' 
    and SUBSTR(VALUE, -7, 5)>='11' and SUBSTR(VALUE, -4, 4) >='2012'), 
v_to as (
    SELECT * from PARAMETER 
    where (NAME = 'From') and SUBSTR(VALUE, 1, 2)>='01' 
    and SUBSTR(VALUE, -7, 5)>='11' and SUBSTR(VALUE, -4, 4) >='2012') 
select f.id, f.name, f.value as from_value, t.value as to_value 
from v_from f 
join v_to t on f.id = t.id 

這裏假設你總是有兩個往返值;如果沒有,你將不得不使用外部連接。