none
BETWEN NVARCHAR 欄位 問題 RRS feed

  • 問題

  • 您好:

    我使用以下 語法,要撈取 01 與 03 之間的資料,原本預期01,02,03

    但結果 卻還有0101 等

    請問 這問題原因 及解法?

    謝謝!

    CREATE TABLE #t (non nvarchar(13) ,noc varchar(13) );
    
    INSERT INTO #t VALUES ('01','01'),('02','02'),('03','03')
    ,('04','04'),('05','05'),('06','06'),('07','07')
    ,('08','08'),('09','09'),('10','10')
    ,('0101','0101'),('0201','0201'),('0301','0301'),('0401','0401')
    ,('0501','0501'),('0601','0601'),('0701','0701'),('0801','0801')
    ,('0901','0901'),('1001','1001'),('1101','1101'),('1201','1201')
    
    SELECT * FROM #t t WHERE T.non BETWEEN '1' AND '3'
    SELECT * FROM #t t WHERE T.non BETWEEN '01' AND '03'
    

    2019年11月28日 下午 12:14

解答

  • 因為看 舊有程式碼, 他有一段 XX BETWEEN '1 AND 'ZZZZ'

    除了程式碼有舊的
    資料庫是否也有舊的
    如果是的話,建議觀察一下舊資料庫的【定序】方式

    定序不同,文字排序時就可能會有差異

    請參考以下

    設定或變更資料庫定序


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    • 已標示為解答 softballnow 2019年12月8日 上午 07:25
    2019年11月29日 上午 04:07

所有回覆

  • 數字和文字的比較方式不一樣。

    比方文字的"1" , "2" , "11"

    由小到大排序會變成  "1", "11", "2"  因為 "11" 的第一個字元 "1" 的編碼小於 "2"


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年11月28日 下午 03:09
  • 1.由您所描述的想要的,我無法知道您的商業邏輯(規則想法)
    所以也比較難告訴您應該怎麼修改才能符合您的商業邏輯

    2.如同Bill淑所說
    文字的排序與您想像中的不一樣
    建議您針對你想下Between And 的欄位
    先下排序之後去觀察,再去思考怎麼應用到您的商業邏輯

    ^_^


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    2019年11月29日 上午 03:00
  • 您好:

    謝謝!

    再請教, 

    1.您說的 文字 排序會 1,11,2

    所以 只要第一個字是 1 (如111111111)就會 都排在 2 前面?

    所以如上問題,  between  '1' and '3'

    他就會 先找1 開頭, 2開頭,3開頭的 資料 (不論 欄位長度)

    2.因為看 舊有程式碼, 他有一段 XX BETWEEN '1 AND 'ZZZZ'

      若正常有下條件, 會根據條件 XX BETWEEN  '條件一' AND 條件二'

       若沒有下條件,則 XX BETWEEN '1 AND 'ZZZZ'

    只是感覺他 有下條件,似乎有些誤差。

    謝謝!

    2019年11月29日 上午 03:24
  • 因為看 舊有程式碼, 他有一段 XX BETWEEN '1 AND 'ZZZZ'

    除了程式碼有舊的
    資料庫是否也有舊的
    如果是的話,建議觀察一下舊資料庫的【定序】方式

    定序不同,文字排序時就可能會有差異

    請參考以下

    設定或變更資料庫定序


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    • 已標示為解答 softballnow 2019年12月8日 上午 07:25
    2019年11月29日 上午 04:07