2016-07-22 62 views
0

我列的例子:爲什麼我的代碼不起作用? (使用多表情+投+案例)

  (name) as varchar(50) 
       s01 
       s02 
       s16 

我想選擇0以上第一遺漏panelname也使用情況和投(在我的例子需要,選擇將「S03」)

WITH cte AS(
    SELECT name 
    FROM customers 
    UNION ALL 
    SELECT 0 
) 

SELECT CASE WHEN cast(min(right(name, 2) + 1) as varchar(50)) < 10 THEN 's0' ELSE 's' END + 
     cast(min(right(name, 2) + 1) as varchar(50)) 
FROM cte 
WHERE NOT EXISTS ( 
    SELECT name 
    FROM customers 
    WHERE cast(right(customers.name, 2) as varchar(50)) = cast(right(cte.name, 2) as varchar(50))+1) 

此代碼的工作原理,但只在我的表爲空或表只包含數字的情況下。

比如我的名字 - 列>的結果將是S03

   1  or 101  
      2   102 
      16   116 

但是,當它包含信

example my columns in name 
      s01   
      s02 
      s016 

它不工作。我得到一個錯誤:將varchar值's01'轉換爲數據類型int時轉換失敗。我應該把其他地方投到varchar?

+0

有什麼建議嗎?或者更好地使用其他代碼來實現我想要做的事情? – user6615498

+0

請編輯您的問題以包含相關的表格DDL和樣本數據作爲DML。 –

+0

我編輯我的問題更具體。有什麼建議麼? – user6615498

回答

1

(發佈代表OP)的

只需要轉換聯合選擇。

WITH cte AS(
    SELECT name 
    FROM customers 
    UNION ALL 
    SELECT CAST(0 AS VARCHAR(50)) 
    FROM INVENTORYPANELCAPTIONS 
) 

SELECT CASE WHEN cast(min(right(name, 2) + 1) as varchar(50)) < 10 THEN 's0' ELSE 's' END 
     + cast(min(right(name, 2) + 1) as varchar(50)) 
FROM cte 
WHERE NOT EXISTS ( 
    SELECT name 
    FROM customers 
    WHERE right(customers.name, 2)= right(cte.name, 2)+1) 
0

你比較int類型的字符串(VARCHAR),所以儘量將varchar號之前你他們爲int值進行比較或與他們做一些操作

也許像這樣爲int,而不是爲varchar (不知道這是否會工作,但只是寫它作爲例子的解決方案如何能夠看):

WITH cte AS(SELECT panelname FROM inventorypanelcaptions UNION ALL SELECT 0) 
SELECT CASE WHEN min(cast(right(panelname, 2) as int)) + 1 < 10 THEN 'o0' ELSE 'o' + cast(min(cast(right(panelname, 2) as int)) + 1 as varchar(50)) END 
FROM cte 
WHERE NOT EXISTS (SELECT panelname FROM inventorypanelcaptions WHERE cast(right(inventorypanelcaptions.panelname, 2) as int) = cast(right(cte.panelname, 2) as int) + 1) 
+0

謝謝你的回答,但我得到同樣的錯誤。 PLS幫助! – user6615498

+0

我仍然得到相同的錯誤:將varchar值「o01」轉換爲數據類型int時轉換失敗。 – user6615498

+0

我編輯它,現在呢? –

相關問題