Eseguire query complesse su campo TEXT

domenica 19 dicembre 2010 - 10.00
Tag Elenco Tags  SQL Server 2008 R2

cypher Profilo | Junior Member

salve a tutti, ho un po di domande che faro in post successivi riguardo delle query complesse:

la struttura del dataset è la seguente:
CREATE TABLE [dbo].[t_table1]( [date] [datetime] NOT NULL, [nick] [varchar](100) NULL, [voto] [float] NOT NULL, [testo] [text] NOT NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

cominciamo con la prima (che non è neanche complessa):
dovrei tirare fuori tutti i testi che hanno questo pattern : "#inizio# @qualcosa"
al che faccio questa query
select testo from dbo.table1 where testo like '#inizio# @%'
solo che mi ritorna il dataset nullo nonostante ci siano effettivamente testi del genere.
facendo alcune prove ho notato che il problema dovrebbe essere nello spazio tra '#inizio#' e '@'. come risolvo?

lbenaglia Profilo | Guru

>la struttura del dataset è la seguente:
>CREATE TABLE [dbo].[t_table1](
> [date] [datetime] NOT NULL,
> [nick] [varchar](100) NULL,
> [voto] [float] NOT NULL,
> [testo] [text] NOT NULL
>) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Ciao,

Dato che utilizzi SQL Server 2008 R2 dovresti evitare di utilizzare data type obsoleti come TEXT dato che verranno rimossi nelle prossime versioni.
Ti suggerisco di utilizzare varchar(max) in alternativa.
Inoltre la colonna voto che range di valori può accettare? Vedo che hai utilizzato un data type decimale approssimato, sei sicuro che sia la scelta corretta?

>cominciamo con la prima (che non è neanche complessa):
>dovrei tirare fuori tutti i testi che hanno questo pattern :
>"#inizio# @qualcosa"
>al che faccio questa query
>select testo from dbo.table1 where testo like '#inizio# @%'
>solo che mi ritorna il dataset nullo nonostante ci siano effettivamente
>testi del genere.
>facendo alcune prove ho notato che il problema dovrebbe essere
>nello spazio tra '#inizio#' e '@'. come risolvo?

A me funziona:

USE tempdb; CREATE TABLE dbo.t_table1( [date] datetime NOT NULL, nick varchar(100) NULL, voto float NOT NULL, testo text NOT NULL ); INSERT dbo.t_table1 VALUES(CURRENT_TIMESTAMP, NULL, 5, '#inizio# @ciao'); SELECT testo FROM dbo.t_table1 WHERE testo like '#inizio# @%'; /* Output: testo --------------- #inizio# @ciao */ DROP TABLE dbo.t_table1;

Il problema sarà altrove.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

cypher Profilo | Junior Member

ti allego i top 5 cosi verifichi (se puoi e hai voglia :)).
per quanto riguarda la scelta delle strutture dati hai ragione magari non è la scelta giusta ma io non sto lavorando sul db vero, devo solo fare analisi.


intanto che ci sono faccio anche la seconda domanda:
del dataset in esame dovrei raggruppare i messaggi simili (nel senso uguali alla fine ma non necessariamente all'inizio) e vedere quante istanze ci sono, chi li ha inoltrati/mandati e quando.

lbenaglia Profilo | Guru

>ti allego i top 5 cosi verifichi (se puoi e hai voglia :)).
Dopo #BOAT# c'è un CR+LF quindi la tua condizione di LIKE è sbagliata.
Ti allego un esempio con la condizione corretta:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>per quanto riguarda la scelta delle strutture dati hai ragione
>magari non è la scelta giusta ma io non sto lavorando sul db
>vero, devo solo fare analisi.
Questo non ti impedisce di utilizzare i data type corretti.

>intanto che ci sono faccio anche la seconda domanda:
>del dataset in esame dovrei raggruppare i messaggi simili (nel
>senso uguali alla fine ma non necessariamente all'inizio) e vedere
>quante istanze ci sono, chi li ha inoltrati/mandati e quando.
Che in base alle righe che hai postato si traduce in quale risultato?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

cypher Profilo | Junior Member

vorrei avere:
testo | utente1 | data | utente2 | data | utenten | data

lbenaglia Profilo | Guru

>vorrei avere:
>testo | utente1 | data
> | utente2 | data
> | utenten | data
Non ho capito, in base alle 5 righe che hai fornito quale deve essere il result set risultante?
Se 5 sono troppo poche posta i comandi di INSERT di un numero sufficiente di righe, seguito dal result set che ti attendi.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

cypher Profilo | Junior Member

col dataset che ti ho dato non si puo perche i testi sono tutti diversi.

con questo invece (in allegato) per esempio le tuple 7 e 8 dovrebbero essere raggruppate. pero questa cosa dovrebbe accadere anche se non sono completamente uguali.
ossia dovrebbe raggruppare anche se l'inizio e la fine magari differiscono ma la parte centrale è uguale.

è possibile inoltre fare utilizzo di espressioni regolari? per esempio me ne servirebbe una che mi tira fuori tutti i testi del tipo "qualcosa @qualcosa" escludendo pero "#inizio# @qualcosa"

p.s. se mi mandi una tua mail ti mando il dataset completo (circa 20000 tuple)

lbenaglia Profilo | Guru

>con questo invece (in allegato) per esempio le tuple 7 e 8 dovrebbero
>essere raggruppate.
Come? Quale deve essere il result set finale con questi dati?

>pero questa cosa dovrebbe accadere anche
>se non sono completamente uguali.
>ossia dovrebbe raggruppare anche se l'inizio e la fine magari
>differiscono ma la parte centrale è uguale.
Come? Quale deve essere il result set finale con questi dati?

>è possibile inoltre fare utilizzo di espressioni regolari?
Nativamente no, ma puoi servirti dell'operatore LIKE.

>per esempio me ne servirebbe una che mi tira fuori tutti i testi
>del tipo "qualcosa @qualcosa" escludendo pero "#inizio# @qualcosa"
>
>p.s. se mi mandi una tua mail ti mando il dataset completo (circa
>20000 tuple)
Le soluzioni proposte su un forum devono essere a disposizione a tutti, altrimenti si parla di consulenza e relativo compenso

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

cypher Profilo | Junior Member

>con questo invece (in allegato) per esempio le tuple 7 e 8 dovrebbero
>essere raggruppate.
>Come? Quale deve essere il result set finale con questi dati?
col dataset allegato dovrebbe essere tipo:
identificatore1 |#BOAT# I agree.. He rocks! Oops, i mean.. Thanks :) RT @little_sparrows: @punchlinedvd FYI MILAN IS THE BEST EVER! #EOAT#
identificatore1 |#BOAT# @punchlinedvd FYI MILAN IS THE BEST EVER! #EOAT#
e cosi via per tutti i testi che hanno del testo in comune e dove "identificatore1" e un id a caso solo per dividere i testi simili

>pero questa cosa dovrebbe accadere anche
>se non sono completamente uguali.
>ossia dovrebbe raggruppare anche se l'inizio e la fine magari
>differiscono ma la parte centrale è uguale.
come sopra

>per esempio me ne servirebbe una che mi tira fuori tutti i testi
>del tipo "qualcosa @qualcosa" escludendo pero "#inizio# @qualcosa"
>Le soluzioni proposte su un forum devono essere a disposizione a tutti, altrimenti si parla di consulenza e relativo compenso
vorrei mi tirasse fuori tuple solo sel tipo:
#BOAT# Cheers! @thelionandrose will be selecting their annual London Trip winner tomorrow! Good luck to all & Happy Holidays! #EOAT#
ossia solo con @qualcosa all'interno della frase e senza "RT" o "via" o "#BOAT#" davanti
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5