2016-07-22 4 views
0

Meine Spalte Beispiel:Warum funktioniert mein Code nicht? (Unter Verwendung von Multi Ausdrücke + Guss + case)

  (name) as varchar(50) 
       s01 
       s02 
       s16 

ich bei der Verwendung von Fall und Guss erste fehlende panelname über 0 auch auswählen möchte (in meinem Beispiel wählt gewünscht wird ‚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) 

Dieser Code funktioniert aber nur, wenn meine Tabelle null ist oder die Tabelle nur Zahlen enthält.

Beispiel meine Spalten in Namen-> Ergebnis wird

   1  or 101  
      2   102 
      16   116 

Aber S03 werden, wenn es Brief

example my columns in name 
      s01   
      s02 
      s016 

Es funktioniert nicht enthalten. Ich erhalte eine Fehlermeldung: Die Konvertierung ist fehlgeschlagen, wenn der Varchar-Wert 's01' in den Datentyp int konvertiert wurde. Soll ich woanders nach Varchar werfen?

+0

Irgendwelche Vorschläge? Oder ist es besser, anderen Code für das zu verwenden, was ich tun möchte? – user6615498

+0

Bearbeiten Sie Ihre Frage, um die relevante Tabelle DDL und Beispieldaten als DML einzuschließen. –

+0

Ich bearbeite meine Frage, um genauer zu sein. Irgendwelche Vorschläge? – user6615498

Antwort

1

(geschrieben im Auftrag des OP).

Es war nur notwendig, um die Gewerkauswahl zu konvertieren.

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

Du vergleichst string (varchar) mit int-Werten, also versuchen varchar Zahlen zu werfen statt varchar auf int, bevor Sie sie mit int-Werte sind zu vergleichen oder einige Operationen mit ihnen

Vielleicht so etwas tun (nicht sicher, ob dies funktionieren wird, aber nur schreibt es als Beispiel, wie die Lösung aussehen könnte):

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

Danke für die Antwort, aber ich bekomme den gleichen Fehler. PLS HILFE! – user6615498

+0

Ich bekomme immer noch den gleichen Fehler: Die Konvertierung ist fehlgeschlagen, wenn der Varchar-Wert 'o01' in den Datentyp int konvertiert wurde. – user6615498

+0

Ich habe es bearbeitet, was ist jetzt? –

Verwandte Themen