promotion image of download ymail app
Promoted
匿名使用者
匿名使用者 發問時間: 電腦與網際網路程式設計 · 1 0 年前

SQL語法: 截取字串

原本的開發工具要轉換到SQL SERVER 的預存程序寫

我實在搞不懂SQL語法 ...><...

請各位幫忙, 萬分感激 ~

我有以下三種類型的字串

ASAHAQ-203A ; ASAHASG254V498X200 ; ASAHAQ4088B610X180 ;

我要的答案(ZZ)分別是

(問題1)品名: AQ-203A ; ASG-254 ;AQ-4088

(問題2)長寬:無 ; 498 & 200 ; 610 & 180 ;

我本來的問題1作業方式是

IF 第7碼 = '-'

Z1 = substr(字串,4,2)

  Z2 = substr(字串,7,3)

CONCATENATE Z1 '-' Z2 INTO ZZ.

ELSEIF 第7碼 <> '0' AND <> '1' AND <> '2' AND <> '3' AND <> '4' AND <> '5' AND <> '6' AND <> '7' AND <> '8' AND <> '9'

Z1 = substr(字串,4,3)

  Z2 = substr(字串,7,3)

CONCATENATE Z1 '-' Z2 INTO ZZ.

ELSE.

Z1 = substr(字串,4,2)

  Z2 = substr(字串,6,4)

CONCATENATE Z1 '-' Z2 INTO ZZ.

ENDIF.

問題2作業方式是

Z1 = substr(字串,11,3)

Z2 = substr(字串,15,3)

麻煩SQL達人 ~

已更新項目:

(1) 問題1可以用CASE WHEN 寫在SELECT中嗎

(2)問題2直接截取字串的可以寫在SELECT中嗎?

(3) 再問一個問題唷..

字串 ****-山鶯廠

我之前是

FIND '-' IN 字串 MATCH OFFSET ZOFF.

IF ZOFF <> 0.

ZOFF = ZOFF + 1.

SHIFT 字串 BY ZOFF PLACES.

ENDIF.

這樣我就可以得出山鶯廠了, 請問可以做嗎?

2 個已更新項目:

問題2是直接在字串找長寬

ASAHASG254V498X200 的長是498 寬是200

沒有IF 的判斷,

也可以在SELECT 中做到嗎?

PS:鄭老師你好厲害, 您只做IT嗎? 應該出來授課才是呀 ~

3 個已更新項目:

請問山鶯廠的問題

我不能直接在select中直接做完嗎?

如果先要計算@DashPos

那是不是還有做LOOP 才可以將ROW DATA一一做檢查

PS: 鄭老師您有在接案嗎? 做習慣4GL的程式要我做T-SQL 真的很難入門耶

4 個已更新項目:

我已經將您MSN加入, 感謝您 !

1 個解答

評分
  • 匿名使用者
    1 0 年前
    最佳解答

    您好,

    (1)Stored Procedure 如下:(名字是 ParseItem)

    CREATE PROCEDURE [dbo].[ParseItem]

    -- Add the parameters for the stored procedure here

    @ItemNo nvarchar(20)

    AS

    BEGIN

    -- SET NOCOUNT ON added to prevent extra result sets from

    -- interfering with SELECT statements.

    SET NOCOUNT ON;

    -- Insert statements for procedure here

    DECLARE @ZZ nvarchar(10)

    IF (substring(@ItemNo,7,1) = '-')

    SET @ZZ = substring(@ItemNo,5,2) + '-' + substring(@ItemNo,9,3)

    ELSE IF charindex(substring(@ItemNo,7,1), '0123456789') = 0

    SET @ZZ = substring(@ItemNo,5,3) + '-' + substring(@ItemNo,8,3)

    ELSE

    SET @ZZ = substring(@ItemNo,5,2) + '-' + substring(@ItemNo,7,4)

    SELECT @ZZ as ItemName, substring(@ItemNo,12,3) as ItemLength, substring(@ItemNo,16,3) as ItemWidth

    END

    (2)測試如下:

    exec dbo.ParseItem 'ASAHAQ-203A'

    exec dbo.ParseItem 'ASAHASG254V498X200'

    exec dbo.ParseItem 'ASAHAQ4088B610X180'

    (3)唯一要注意的,就是T-SQL 裡取子字串的函數,和你原來的 "substr"函數,剛好差一位,也就是:

    substr("abc",1,2) = "bc"

    substring("abc",1,2) = "ab"

    2010-03-17 13:38:14 補充:

    (1)SET @ZZ =

    CASE WHEN (substring(@ItemNo,7,1) = '-') THEN substring(@ItemNo,5,2) + '-' + substring(@ItemNo,9,3)

    WHEN charindex(substring(@ItemNo,7,1), '0123456789') = 0 THEN substring(@ItemNo,5,3) + '-' + substring(@ItemNo,8,3)

    ELSE substring(@ItemNo,5,2) + '-' + substring(@ItemNo,9,3)

    END

    2010-03-17 13:38:30 補充:

    (2)不懂您的意思?

    2010-03-17 13:38:41 補充:

    (3)

    DECLARE @Add nvarchar(20), @DashPos smallint;

    SET @Add = '****-山鶯廠';

    SET @DashPos = charindex('-', '****-山鶯廠')

    SELECT substring(@Add,@DashPos+1, datalength(@Add) - (@DashPos+1))

    2010-03-17 16:34:13 補充:

    "問題2是直接在字串找長寬..."

    --> 其實我之前的回答,就是照你舊的邏輯作的。

    "問題2作業方式是

    Z1 = substr(字串,11,3)

    Z2 = substr(字串,15,3)"

    所以我是用SELECT @ZZ as ItemName, substring(@ItemNo,12,3) as ItemLength, substring(@ItemNo,16,3) as ItemWidth

    ItemLength --> Z1

    ItemWidth --> Z2

    我並沒有用到 IF 喔!

    ps: 跟很多大大比起來,我只是B咖而已 ^_^ ,授課大概只能教點入門的東西吧.. 呵呵。

    2010-03-17 17:37:25 補充:

    "請問山鶯廠的問題

    我不能直接在select中直接做完嗎?"

    --> 單就您舉的例子,當然是可以的,我用變數的作法,只是讓你易於閱讀。

    方法一:

    SELECT substring('****-山鶯廠',charindex('-', '****-山鶯廠')+1, datalength('****-山鶯廠') - (charindex('-', '****-山鶯廠')+1))

    --> 這是原來的4GL 邏輯下去套的。

    方法二:

    SELECT replace(replace('****-山鶯廠','*',''),'-','')

    --> 這是把字串裡的"*" 及 "-" 字串都置換掉

    2010-03-17 17:37:34 補充:

    ps: 還有接案或其他問題可email : Teacher_jenbw@yahoo.com.tw ; t 改小寫; 給我你的MSN。

    • Commenter avatar登入以對解答發表意見
還有問題?馬上發問,尋求解答。