none
sql - errore ? RRS feed

  • Domanda

  • salve


    non capisco dove sbaglio

    se scrivo in una query

    SELECT

    cFORNITORE, CAMPO1

    CASE WHEN [CAMPO1] IS NOT NULL THEN 'pieno'  ELSE [cFORNITORE] END

    FROM miaTABELLA

    funziona ma se scrivo

    CASE WHEN [CAMPO1] IS NOT NULL THEN 'pieno' + [Campo1] ELSE [cFORNITORE] END

    non lo accetta.

    dove sbaglio? vorrei visualizzare il valore di [CAMPO1] se c'e' altrimenti [cFORNITORE]

    GRAZIE A TUTTI ANTICIPATAMENTE

    mercoledì 4 ottobre 2017 08:54

Tutte le risposte

  • mi scrive conflitto di interazione
    mercoledì 4 ottobre 2017 09:00
  • Ciao,

    Ho riprodotto in locale la situazione della tua domanda e l'errore lo puoi avere già a livello di sintassi dal momento in cui selezioni la colonna CAMPO1 a cui segue il costrutto CASE senza separatore virgola (,). Seguendo la tua richiesta, la query corretta dovrebbe essere la seguente:

    SELECT 
    	cFORNITORE,
    	CASE 
    		WHEN CAMPO1 IS NOT NULL THEN 'pieno ' + CAMPO1 ELSE cFORNITORE 
    	END
    FROM miaTABELLA

    Come vedi, la seconda colonna selezionata non sarà sempre "pieno" seguito CAMPO1 come nel tuo primo esempio ma potrà essere anche cFornitore.

    Fammi sapere se hai dubbi su questa soluzione, in ogni caso ti lascio il link alla documentazione del CASE in SQL Server: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql

    A presto


    • Modificato Gabriele Etta giovedì 5 ottobre 2017 07:04 Aggiunta documentazione CASE
    • Contrassegnato come risposta pfmarro giovedì 5 ottobre 2017 09:20
    • Contrassegno come risposta annullato pfmarro giovedì 5 ottobre 2017 09:20
    • Proposto come risposta Gabriele Etta giovedì 5 ottobre 2017 09:22
    • Proposta come risposta annullata Gabriele Etta giovedì 5 ottobre 2017 09:25
    giovedì 5 ottobre 2017 06:59
  • Grazie dell'interessamento

    il problema non riesco a risolverlo

    non capisco

    se scrivo

    SELECT 
    	cFORNITORE,
    	CASE 
    		WHEN CAMPO1 IS NOT NULL THEN 'pieno ' ELSE cFORNITORE 
    	END
    FROM miaTABELLA

    funziona

    ma se metto nel caso True (cioe' solo se non e' nullo CAMPO1)

    SELECT 
    	cFORNITORE,
    	CASE 
    		WHEN CAMPO1 IS NOT NULL THEN CAMPO1 ELSE cFORNITORE 
    	END
    FROM miaTABELLA

    MI SCRIVE CONFLITTO DI INTERAZIONE

    POTETE AIUTARMI A risolvere il problema? anche perche' non posso utilizzare un campo calcolato in un altro campo calcolato

    GRAZIE

    giovedì 5 ottobre 2017 09:24
  • Il campo calcolato di cui parli è CAMPO1?
    giovedì 5 ottobre 2017 09:26
  • no il campo1 e' un campo

    SELECT
        cFORNITORE,
        CASE
            WHEN CAMPO1 IS NOT NULL THEN CAMPO1 ELSE cFORNITORE
        END
    FROM miaTABELLA


    pensavo di aggirare il tutto facendo ma mi pare che non sia possibile testare il valore di un campo calcolato

    SELECT
        cFORNITORE,
        CASE
            WHEN CAMPO1 IS NOT NULL THEN 0 ELSE cFORNITORE
        END as tmp

       CASE
            WHEN tmp = 0 THEN campo1 ELSE cFORNITORE
        END as tmp

     FROM miaTABELLA

    giovedì 5 ottobre 2017 11:02
  • Ciao,

    SELECT
        cFORNITORE,
        CASE
            WHEN CAMPO1 IS NOT NULL THEN 0 ELSE cFORNITORE
        END as tmp
       CASE
            WHEN tmp = 0 THEN campo1 ELSE cFORNITORE
        END as tmp
     FROM miaTABELLA

    Questa query è errata dal punto di vista sintattico in quanto la visibilità di tmp non si ha a seguito della sua dichiarazione: non si comporta come un linguaggio imperativo sotto questo punto di vista.

    Per rispondere meglio alla tua domanda avrei bisogno di vedere lo script di creazione di miaTabella, ma se CAMPO1 è davvero un campo non calcolato allora la soluzione di prima dovrebbe funzionare dal momento che l'ho anche testata in locale con campi non calcolati e oltretutto ha la stessa semantica di quello che vorresti fare senza passare da strutture d'appoggio.

    Rimango a disposizione per ulteriori chiarimenti, ma per le prossime volte cerca di esprimere meglio anche il contesto in cui si pone la domanda in modo tale da avere un'idea completa già alla prima risposta.

    A presto

    giovedì 5 ottobre 2017 11:42