Problema in condizione all'interno di una query

di il
17 risposte

Problema in condizione all'interno di una query

Buonasera
perdonate l'ignoranza, ma non riesco ad inserire una semplice condizione all'interno di una query su SQL Server,
ho un campo int (campo1) in una tabella ed un campo Text (campo2) in un'altra, dovrei aggiungere :
where campo1 = campo2
ovviamente non risolve la condizione e mi da errore, ma mi da errore anche usando cast(campo1 as text) o se uso cast(campo2 as int)

ripeto scusate la mia ignoranza ma ce un modo per effettuare tale condizione ?

Considerate che il campo2 può essere un numero o null
ma anche se metto la condizione where campo2 is not null e dopo la cast mi da comunque errore

17 Risposte

  • Re: Problema in condizione all'interno di una query

    Salve,

    Papercola ha scritto:


    ...
    ho un campo int (campo1) in una tabella ed un campo Text (campo2) in un'altra, dovrei aggiungere :
    where campo1 = campo2
    ...
    quanto enunciato esprime una espressione di JOIN e non una clausola WHERE...
    puoi per favore indicare la tua query?
    salutoni romagnoli
    --
    Andrea
  • Re: Problema in condizione all'interno di una query

    Si hai perfettamente ragione, riguardando la query é esattamente una condizione di Join, rimane allora la problematica su come inserire la join che preveda il confronto tra il campo INT e Text (sempre se questo è possibile)
    INNER JOIN ba_medic ON ba_fill_age_params.APRESLIST = ba_medic.RSRESOURCE
    dove RSRESUORCE è INT
  • Re: Problema in condizione all'interno di una query

    E' una JOIN MA non e' necessario usare operatore JOIN.

    In soldoni:

    SELECT ... FROM tabella1 AS t1, tabella2 AS t2 WHERE t1.campo1 = t2.campo2

    In ogni caso,

    NON SI PUO'

    confrontare DIRETTAMENTE testo con intero.

    DEVONO essere dello stesso tipo! TUTTE E DUE testo O tutti e due intero
  • Re: Problema in condizione all'interno di una query

    Potresti considerare di fare il cast di uno dei due valori https://docs.microsoft.com/it-it/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver15
  • Re: Problema in condizione all'interno di una query

    In realta si può a patto che sia possibile operare una conversione implicita tra i tipi;

    questa funziona
    select 'Pippo' where '1'=1

    questa no
    select 'Pippo' where 'x'=1
  • Re: Problema in condizione all'interno di una query

    surfernet ha scritto:


    Potresti considerare di fare il cast di uno dei due valori https://docs.microsoft.com/it-it/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver15
    Mi pare che abbia detto che ha provato col cast... bisogna capire perché non gli ha funzionato e quale errore ha avuto.
  • Re: Problema in condizione all'interno di una query

    Data l’urgenza ho risolto con l’esportazione delle due tabelle in Excel , modifica del tipo di campo da testo a numerico e la creazione di sue nuove tabelle d’appoggio in cui ovviamente la join funziona.
    Lunedì che torno dal cliente vi mando l’errore Che si genera utilizzando la cast.
    Per adesso grazie a tutti per gli interventi effettuati
  • Re: Problema in condizione all'interno di una query

    Salve,

    Papercola ha scritto:


    ho un campo int (campo1) in una tabella ed un campo Text (campo2) in un'altra, dovrei aggiungere :
    where campo1 = campo2
    scrivi che il tipo di dato di [campo2] e' Text....
    confermi che sia proprio un TEXT(https://docs.microsoft.com/it-it/sql/t-sql/data-types/ntext-text-and-image-transact-sql?view=sql-server-ver15) oppure hai cosi' indicato intendendo un "valore testuale", e quindi un (n)varchar ???

    se e' proprio un tipo TEXT, allora il cast da text a varchar / int e' obbligatorio, visto che il tipo Text e' "un'altra cosa" rispetto al tradizionale tipo di dato testuale... vedi ad esempio anche https://stackoverflow.com/questions/27888243/the-data-types-text-and-varchar-are-incompatible-in-the-equal-to-operator-in-c-s/27890419

    @migliorabile,

    migliorabile ha scritto:


    E' una JOIN MA non e' necessario usare operatore JOIN.

    In soldoni:
    SELECT ... FROM tabella1 AS t1, tabella2 AS t2 WHERE t1.campo1 = t2.campo2
    ...
    dai, , cerchiamo di evitare le operazioni di JOIN ANSI 89, deprecate da anni su tutti i DBMS... SQL Server ne ha addirittura rimosso il supporto dalla versione 2012 ()

    salutoni romagnoli
    --
    Andrea
  • Re: Problema in condizione all'interno di una query

    Ba_fill_age_params INNER JOIN ba_medic ON ba_fill_age_params.APRESLIST = Cast(ba_medic.RSRESOURCE as text)

    Messaggio 529, livello 16, stato 2, riga 10
    La conversione esplicita del tipo di dati da int a text non è consentita.

    ----------------------------------------
    ba_fill_age_params INNER JOIN ba_medic ON Cast(ba_fill_age_params.APRESLIST as int) = ba_medic.RSRESOURCE

    Messaggio 529, livello 16, stato 2, riga 9
    La conversione esplicita del tipo di dati da text a int non è consentita.

    -----------------------------------------
    ba_fill_age_params
    Nome Stato di integrità criteri
    APSERLIST (text, Null)

    ba_medic
    Nome Stato di integrità criteri
    RSRESOURCE (FK, int, Null)

    Queste le Join provate, i messaggi di errore e la definizione dei due campi

    Ancora grazie per l'interessamento dimostrato
  • Re: Problema in condizione all'interno di una query

    Questi i valori del campo nella tabella ba_fill_age_params
    267
    274
    APERTURA
    60
    235
    102
    236
    212
    52
    263
    Questi i valori del campo nella tabella ba_medic
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Mi aspettavo eventualmente un errore nella riga 3 della tabella ba_fill_age_params e non nella 9

    Ma sicuramente sto sbagliando io senza capire dove
  • Re: Problema in condizione all'interno di una query

    Rileggiti l'ultimo messaggio di asql ;

    per escludere da ba_fill_age_params i valori non convertibili in numero
    usa la funzione ISNUMERIC
  • Re: Problema in condizione all'interno di una query

    Salve,
    "l'errore", concettualmente, e' il "tipo di dato", che, in SQL Server, che NON E' quello che tu pensi in effetti sia... NON E' un tipo di "carattere", ma "leggermente" diverso, e gli si applicano regole diverse dal tipico (n)varchar...

    per capirci, creando una tabella (non metto il codice di creazione in quanto il parser del forum lo identifica come possibile attacco)
    tabella dbo.tNum ( valoreI int );
    tabella dbo.tText ( valoreT text );
    popolate come segue:
    INSERT INTO dbo.tText
    VALUES ( '1' ), ( 'A' ), ( '2' ), ( 'B' );

    INSERT INTO dbo.tNum
    VALUES ( 1 ), ( 2 ), ( 3 );

    puoi verificare i seguenti test:
    
    GO
    PRINT 'errore 1';
    GO
    SELECT *
    	FROM [dbo].[tNum] n
    		JOIN [dbo].[tText] t ON n.[valoreI] = t.[valoreT];
    GO
    PRINT 'errore 2';
    GO
    SELECT *
    	FROM [dbo].[tNum] n
    		JOIN [dbo].[tText] t ON CONVERT( varchar(10), n.[valoreI] ) = t.[valoreT];
    GO
    PRINT 'valido 3';
    GO
    SELECT *
    	FROM [dbo].[tNum] n
    		JOIN [dbo].[tText] t ON CONVERT( varchar(10), n.[valoreI] ) = CONVERT( varchar(8000), t.[valoreT] );
    --<-----------------
    errore 1
    Msg 206, Level 16, State 2, Line 20
    Operand type clash: text is incompatible with int
    errore 2
    Msg 402, Level 16, State 1, Line 28
    The data types varchar and text are incompatible in the equal to operator.
    valido 3
    valoreI     valoreT
    ----------- -------------------
    1           1
    2           2
    
    quindi il cast implicito non e' sufficiente, e vanno castati entrambi al tipo di dato (n)varchar...

    poi, ci sarebbe anche da vedere se in effetti il tipo di dato text sia in effetti necessario per le tue necessita'...
    oramai, SQL Server consente nei tradizionali (n)varchar di definire "l'allocazione" come MAX,
    
    DECLARE @dato varchar(MAX);
    
    che permette l'allocazione potenziale di 2GB di dati, e penso possa essere piu' che sufficiente , abbandonando i "vecchi" tipi di dato image e text...

    salutoni romagnoli
    --
    Andrea
  • Re: Problema in condizione all'interno di una query

    sspintux ha scritto:


    Rileggiti l'ultimo messaggio di asql ;

    per escludere da ba_fill_age_params i valori non convertibili in numero
    usa la funzione ISNUMERIC
    Grazie sspintux
    Io ho letto tutti i messaggi, ma l'errore rimane anche utilizzando ISNUMERIC come da te proposto, come ho scritto per adesso ho risolto ma dato che sarà (purtroppo) una query che dovrò utilizzare in modo cadenzato durante l'anno, volevo cercare di risolvere per i prossimi utilizzi.

    Grazie comunque per l'interessamento dimostrato
  • Re: Problema in condizione all'interno di una query

    E risolvili :D
    ancora non mi hai risposto se in effetti il tipo di dato di base sia un "text"... ma dalle eccezioni che vengono sollevate direi di si..

    al di la' di questo, non so se hai gia' visto l'ultimo mio, dove non utilizzo ISNUMERIC, ma solo il cast esplicito di entrambe le parti coinvolte nell'operazione di JOIN... con questo cast, tecnicamente non c'e' bisogno di altra operazione (vedi ISNUMERIC o altro) in quanto vengono correlati i valori sia a destra che a sinistra della JOIN nella loro rappresentazione alfanumerica, ed il confronto positivo ovviamente comporta il soddisfacimento della condizione di JOIN e l'inserimento della riga nel resultset intermedio, eventualmente da filtrare ad opera della successiva clausola di WHERE {questo in ambito logico e non effetivamente effettuato in quest'ordine da parte del processore di query, che potrebbe anche filtrare a monte ancora nella fase di preparazione del prodotto cartesiano definito nella fase FROM nel caso questo lo aiuti a ridurre gia' a monte la cardinalita' restituita, ma questo e' tutto un altro discorso}

    salutoni romagnoli
    --
    Andrea
Devi accedere o registrarti per scrivere nel forum
17 risposte