Announcement

Collapse
No announcement yet.

SQL eine Spalte merhfach Casten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL eine Spalte merhfach Casten

    Hallo und danke schon mal fürs lesen!

    Beschreibung:

    Ich habe eine Tabelle mit einer Spalte in der ich Integer werte und Strings habe. In einer Zweiten Tabelle ist definiert welche attributeId Spalten int Werte oder Strings sind. Ich würde gerne für meine Suche die verschiedenen Daten Filtern. Mein Code hierfür steht weiter unten. Ich glaube das geht im Grunde aber ich kann mich auch Irren.(Mann Verwechselt ja auch mal etwas.

    Auf jeden fall Danke für eure Hilfe.


    tabellen Defenition
    Code:
    So ich habe eine Tabelle die wie folgt aufgebaut ist:
    CREATE TABLE [dbo].[productAttribute](
    	[attributeId] [varchar](50) NULL,
    	[productId] [int] NULL,
    	[productAttributeValue] [varchar](150) NULL,
    	[productAttributeText] [varchar](300) NULL
    ) ON [PRIMARY]
    Mein Code
    SELECT attributeId, productId, productAttributeValue, productAttributeText
    FROM productAttribute
    WHERE (productAttributeValue = 'Y') AND (attributeId = 'FLD-NET') OR
    (attributeId = 'FLD-GSF') AND (CAST(productAttributeValue AS INT) >= CAST('30' AS INT)) AND (CAST(productAttributeValue AS INT) <= CAST('40' AS INT))
    Fehler:
    Conversion failed when converting the varchar value 'Optional' to data type int.

    Tabellen Inhalt Beispiel Leergelassen Felder sind leer String
    productAttribute || productId || productAttributeValue || productAttributeText
    FLD-DUB 1
    FLD-GSB 1 20
    FLD-GSF 1 30
    FLD-NET 1 Y
    FLD-GSF 2
    FLD-NET 2
    FLD-DUB 3
    FLD-GSB 3 23
    FLD-GSF 3 40
    FLD-NET 3 Optional

    usw.

  • #2
    Und? 'optional' ist nun mal kein Integer, auch wenn Du castest...

    Comment


    • #3
      Ja aber FLD-GSF da drin sind ja Zahlen und bei denn FLD-NET sind halt strings drin. Es müsste doch eine Möglichkeit geben nach beiden in einer where abfrage zu suchen oder doch nicht ?

      Comment


      • #4
        wie wärs mit der richtigen Klammerung in der WHERE-Bedingung...

        z.B. so:[HIGHLIGHT="SQL"]WITH productAttribute
        (attributeId
        , productId
        , productAttributeValue
        ) AS
        ( SELECT 'FLD-GSF', '1', '30' UNION ALL
        SELECT 'FLD-NET', '1', 'Y' UNION ALL
        SELECT 'FLD-GSF', '2', '' UNION ALL
        SELECT 'FLD-NET', '2', '' UNION ALL
        SELECT 'FLD-GSB', '3', '23' UNION ALL
        SELECT 'FLD-GSF', '3', '40' UNION ALL
        SELECT 'FLD-NET', '3', 'Optional'
        )
        SELECT attributeId
        , productId
        , productAttributeValue
        FROM productAttribute
        WHERE (productAttributeValue = 'Y')
        AND (attributeId = 'FLD-NET')
        OR (
        (attributeId = 'FLD-GSF')
        AND (CAST(productAttributeValue AS INT) >= 30)
        AND (CAST(productAttributeValue AS INT) <= 40
        )) [/HIGHLIGHT]
        Zuletzt editiert von ebis; 07.07.2010, 18:41.

        Comment


        • #5
          Es kommt leider immer noch der Selbe Fehler. Wie meinst du das mit dem UNION ALL in diesem Context genau ? Da kann ich leider nicht ganz Folgen.

          Danke schon mal für die Hilfe

          Comment


          • #6
            Also da alles nicht Funktioniert hat lasse ich jetzt eine Schleife durchlaufen.
            Somit habe ich zwar zwei SQL abfragen und
            muss die beiden Ergebnisse zusammen fassen und die Doppelten heraus Filtern aber es geht ja nicht anders. (Performance mäßig natürlich murks)

            Danke für deine Hilfe ebis

            Comment


            • #7
              Mit IsNumeric kannst Du noch abprüfen, ob es sich zumindest um einen numerischen Wert handelt, was aber auch noch nicht sagt, das er nach INT konvertiert werden kann:
              [highlight=SQL]WITH productAttribute
              (attributeId , productId , productAttributeValue )
              AS
              ( SELECT 'FLD-GSF', '1', '30' UNION ALL
              SELECT 'FLD-NET', '1', 'Y' UNION ALL
              SELECT 'FLD-GSF', '2', '' UNION ALL
              SELECT 'FLD-NET', '2', '' UNION ALL
              SELECT 'FLD-GSB', '3', '23' UNION ALL
              SELECT 'FLD-GSF', '3', '40' UNION ALL
              SELECT 'FLD-NET', '3', 'Optional' )
              SELECT attributeId , productId , productAttributeValue
              FROM productAttribute
              WHERE ((productAttributeValue = 'Y')
              AND (attributeId = 'FLD-NET'))
              OR (
              (attributeId = 'FLD-GSF')
              AND ISNUMERIC(productAttributeValue) = 1
              AND (CAST(productAttributeValue AS INT) >= 30)
              AND (CAST(productAttributeValue AS INT) <= 40 ))[/highlight]
              Olaf Helper

              <Blog> <Xing>
              * cogito ergo sum * errare humanum est * quote erat demonstrandum *
              Wenn ich denke, ist das ein Fehler und das beweise ich täglich

              Comment


              • #8
                Das hat Funktioniert. Hatt ich überhaupt nicht dran gedacht.
                Danke für denn Hinweis !

                Comment

                Working...
                X