顯示具有 SQL 標籤的文章。 顯示所有文章
顯示具有 SQL 標籤的文章。 顯示所有文章

2021年11月9日 星期二

POSTGRE SQL 想使用變數去定義一段日期區間, 但遍尋不到像是在 MSSQL 時常用的 DECLARE @count int, @x int, @y nvarchar(10)...

想到一招利用 CTE 方式去定義一個這樣類似變數的作法來實現...

原來的script

with

cte_order_11month(uuid ,counts)

as (

--前11個月的所有訂購

select 

c.uuidcount(1) 

FROM ecorder e 

LEFT JOIN customer c ON c.id=e.customer_id 

 WHERE e.ecorder_source NOT IN ('11','12','14','15','16')

       and e.ecorder_date >= current_date - interval '1 month' * 12

       and e.ecorder_date <  to_date(to_char(current_date'yyyy/MM')||'/01''yyyy/MM/dd')

GROUP BY c.uuid

HAVING count(1)>0

)
....

上面code裡的current_date 是系統定義的當天, 若要想要改變日期, 就要在許多用到 current_date 的地方置換掉, 變為你要的日期....這對我來說真是痛點啊...

試著玩了一下底下的寫法..

with

v_test(start_date)

as (

select to_date('2021-10-1' , 'yyyy-mm-dd')

--select current_date

),

cte_order_11month(uuid ,counts)

as (

--前11個月的所有訂購

select 

c.uuid, count(1) 

FROM ecorder e 

LEFT JOIN customer c ON c.id=e.customer_id 

WHERE e.ecorder_source NOT IN ('11','12','14','15','16')

       and e.ecorder_date >= (select start_date from v_test) - interval '1 month' * 12

       and e.ecorder_date <  to_date(to_char((select start_date from v_test), 'yyyy/MM')||'/01', 'yyyy/MM/dd')

GROUP BY c.uuid

HAVING count(1)>0

)
....


以上面片段Script 為例 e.ecorder_date >= (select start_date from v_test), 其中select start_date from v_test 就是去我們自定義的v_test中的 start_date, 取出值來後, 再接著處理..

那這樣不就是變相的可以使用變數, 來完成這段 script 查詢嗎? 帥啦~

2018年8月14日 星期二

如何update Oracle某一TABLE裡的排序位, 並以名稱做為排序

在這裡做個筆記, 功能是以名稱排序後, update 欄位中的排序欄位(SORT)

update TABLE1 t set t.SORT =
    ( select RN
      from (select ROW_NUMBER() OVER(ORDER BY NAME) RN ,TABLE1.CODE
             from TABLE1
             where SYSTYPE='TYPE1'
             order by nlssort(NAME,'NLS_SORT=TCHINESE_RADICAL_M') 
           )
      where t.CODE = CODE and t.SYSTYPE = SYSTYPE
    )
where SYSTYPE='TYPE1'

紀錄一下~

2017年1月6日 星期五

[程式類]-PLSQL(oracle)中字字碼RDAP 字數算錯

在PLSQL 若採用RDAP 想輸出固定字數的字元時我們通常採用;

LDAP(Col, 10, ' ')

Col指的是欄位,
10表示固定10碼
' '表示要填不足碼的值
LDAP指左補' ',表示此欄位靠右;RDAP則反之

但是若Col裡的值是中文字時, 這時就要注意"難字"的問題

例:

LDAP('這是測式堃',10,' ')

這時它會誤判堃這個字,會造成所要的結果和你想的不一樣,

中文若要輸出固字的字數,則要使用DECode方法來避免這個問題產生

RPAD(DECODE('這是測式堃', NULL, ' ' , '這是測式堃'), 10, ' ')

POSTGRE SQL 想使用變數去定義一段日期區間, 但遍尋不到像是在 MSSQL 時常用的 DECLARE @count int, @x int, @y nvarchar(10)... 想到一招利用 CTE 方式去定義一個這樣類似變數的作法來實現... 原來的script w...