2015年5月20日 星期三

[sql]nvl、nvl2、nullif、coalesce用法

1nvl
語法:nvl(expr1, expr2)
功能:如果expr1null,則nvl函數返回expr2的值,否則返回expr1的值,如果兩個參數都為null,則返回null
2nvl2
語法:nvl2(expr1, expr2, expr3)
功能:如果expr1null,則nvl2函數返回expr3的值;如果expr1的值不為null,則nvl2函數返回expr2的值。
3nullif
語法:nullif(expr1, expr2)
功能:如果expr1expr2相等,則返回null;如果expr1expr2不想等,則返回第一個值expr1
4coalesce
語法:coalesce(expr1, expr2, expr3, ..., expr n)

功能:按照順序,返回參數清單中的第一個不為null的值。例如,假如expr1不為空,則返回expr1;加入expr1為空,expr2不為空,則返回expr2,以此類推。如果參數都是null,則返回null

http://yedward.net/?id=178

2015年4月16日 星期四

[SQL]判斷是否有中文字,英文字,數字(正規表示式)


正規表示式 說明及範例
--------------------------------------
[0-9] 含數字之字串
[a-z0-9] 含數字或小寫字母之字串
[a-zA-Z0-9] 含數字或字母之字串
[^]             不含括號內的字串
/^xy/        以 “xy” 開始的字串,例如 “xyz”, “xyab”(若要比對 ^,請使用 \^)
/xy$/        以 “xy” 結尾的字串,例如 “axy”, “abxy”以 “xy” 結尾的字串,例如 “axy”, “abxy” (若要比對 $,請使用 \$)




======================================================================
[Sample Code]

create table test_table(col1 varchar2(10), col2 varchar2(20));

insert into test_table
select '1', '測試' from dual;

insert into test_table
select '2', '123' from dual;

insert into test_table
select '3', 'abc' from dual;

insert into test_table
select '4', 'abc123' from dual;

DECLARE
    li_result number;
 BEGIN
   
    select count(*)
    into li_result
    from test_table
--    where REGEXP_LIKE(col2, '[-鶿]' ) and col1 = '1';
    where REGEXP_LIKE(col2, '[^a-zA-Z0-9]' ) and col1 = '1';
    dbms_output.put_line('result1:' || li_result);
   
   
    select count(*)
    into li_result
    from test_table
    where REGEXP_LIKE(col2, '[0-9]' ) and col1 = '2';
    dbms_output.put_line('result2:' || li_result);
   
   
    select count(*)
    into li_result
    from test_table
    where REGEXP_LIKE(col2, '[a-zA-Z]' ) and col1 = '2';
    dbms_output.put_line('result3:' || li_result);
   
   
    select count(*)
    into li_result
    from test_table
    where REGEXP_LIKE(col2, '[a-zA-Z0-9]' ) and col1 = '2';
    dbms_output.put_line('result4:' || li_result);
   
 END;


-- 查詢有中文的資料
SELECT column1, column2, column3, column4, column5
  FROM TABLE1

 WHERE REGEXP_LIKE(column1, '[-鶿]');

http://tomkuo139.blogspot.tw/2014/02/oracle-plsql.html






[SQL]PLSQL EXPLAIN PLAN

參考查效能時,cost, bytes 和 cardinality的代表意義

COST沒有單位,是一個相對值,是SQL以CBO方式解析執行計劃時,供ORACLE來評估CBO成本,選擇執行計劃用的。沒有明確的含義,但是在對比是就非常有用。
公式:COST=(Single Block I/O COST + MultiBlock I/O Cost + CPU Cost)/ Sreadtim
 
Operation:當前操作的內容。
Rows:也就是10g版本以前的Cardinality(基數),Oracle估計當前操作的返回結果集行數。
Bytes:表示執行該步驟後返回的字節數。
Cost(CPU):表示執行到該步驟的一個執行成本,用於說明SQL執行的代價。
Time:Oracle 估計當前操作的時間。


http://fanli7.net/a/shujuku/20120524/165775.html

2015年1月13日 星期二

[SQL]取得第N筆的值


利用rownum外層再包一個select就可以做到取第N筆的值

SELECT *
FROM (select salary2.*, rownum rnum from
             (select * from salary ORDER BY salary_amount DESC) salary2
      where rownum <= 2 )
WHERE rnum >= 2;
http://www.techonthenet.com/oracle/questions/second_highest.php

2014年12月2日 星期二

[SQL]increment rownum by value




參考:http://stackoverflow.com/questions/10477085/oracle-partition-by-and-row-number-keyword
http://www.techhoney.com/oracle/clause/row_number-clause-in-oracle-sql-plsql/

SELECT  LINE_ATTRIBUTE3,   ROW_NUMBER () over (partition by LINE_ATTRIBUTE3 order by LINE_ATTRIBUTE3)  FROM t_cht_si_ap_ebs_out ;


output
0214V00000009 3
0214V00000010 1
0214V00000011 1
0214V00000012 1
0214V00000012 2
0214V00000013 1
0214V00000014 1
0214V00000014 2
0214V00000014 3
0214V00000015 1
0214V00000015 2
0214V00000015 3


另外還有其他排序方式
參考:
ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN DESC)  
RANK()       OVER(PARTITION BY COLUMN ORDER BY COLUMN DESC) 
DENSE_RANK() OVER(PARTITION BY COLUMN ORDER BY COLUMN DESC) 

https://tw.news.yahoo.com/%E9%98%B2%E8%83%83%E9%A3%9F%E9%81%93%E9%80%86%E6%B5%81-%E5%B0%91%E5%96%9D%E5%92%96%E5%95%A15%E6%8B%9B%E6%90%9E%E5%AE%9A-040404333.html

2014年8月5日 星期二

[Hibernate]insert one record multiple times

前言:

在hibernate底下,做insert同一筆record多次時,遇到以下問題


(1)如果同一筆資料insert兩次,會變成第二次update同一筆資料


(2)如果把id設為null,再save會跳出下面exception
entifier of an instance of was altered from to null

(3)如果把id設為0或其他值,再save會跳出下面exception
identifier of an instance of was altered from to n


解決方式:
      先new Entity,copyProperties後再save

Reference:http://my.oschina.net/liangzhenghui/blog/194939

2014年7月21日 星期一

[JAVA] String 相關工具

   /**
     * 取得字串長度(中文為2,數字為1,半形為1,全形為2)
     *
     * @param value
     * @return
     */
    public static int strLength(final String value) {
        int length = 0;
        String str = (value == null) ? "" : value; // 避免null,造成exception
        char character;
       
        for (int i = 0; i < str.length(); i++) {
            character = str.charAt(i);
            // 若不為英文字,或半形時,長度加1(長度算2)
            if (Character.UnicodeBlock.of(character) != Character.UnicodeBlock.BASIC_LATIN || !isHalfWidth(character)) {
                length++;
            }
           
            length++;
        }
       
        return length;
    }

    /**
     * 判斷是否為半形
     *
     * @param character
     * @return
     */
    public static boolean isHalfWidth(char c)   {
        return '\u0000' <= c && c <= '\u00FF'
            || '\uFF61' <= c && c <= '\uFFDC'
            || '\uFFE8' <= c && c <= '\uFFEE' ;

    }