2016-08-09 2 views
2

La requête que je commence avec des lignes a 40.000 de lignes vides, qui provient d'un problème avec la feuille de calcul d'origine à partir de laquelle elle a été prise.Coldfusion requêtes des requêtes avec des chaînes vides

Utilisation d'un serveur CF16

Je voudrais faire une requête de requêtes sur un nom variablement "colonne de clé.

Dans ma requête:

var keyColumn = "Permit No."

var newQuery = "select * from source where (cast('#keyColumn#' as varchar) <> '')";

Note: le casting vient de this suggestion

Je reçois encore tous ces champs vides là-dedans.

Mais quand je l'utilise « Ville » comme KeyColumn, cela fonctionne. Comment les valeurs de ces deux colonnes diffèrent-elles lorsqu'elles disent toutes deux [chaîne vide] dans le vidage de la requête?

output comparison with both query of queries

Est-ce un problème avec les noms de colonnes? Quel genre de données sont dans ces cellules?

+0

Toute différence si vous essayez 'where col is NOT NULL'? * Quel genre de données sont dans ces cellules * Dump et découvrir. Quelque chose comme 'writeDump (yourQuery.columnName [rowNum] .getClass(). Nom)'. Peut également vérifier les longueurs de valeur pour voir si c'est vraiment une chaîne vide. – Leigh

+0

@Leigh 'java.lang.String' dans une cellule comme 23 avec' [chaîne vide] '. 'n'est pas nul' check' n'a rien changé. Merci d'avoir signalé la fonction getClass –

+0

(Edit) Mis à part la vérification de la valeur, la longueur est 0, êtes-vous sûr que le SQL est valide? Raison pour demander est que je ne me souviens pas si c'est la bonne façon d'échapper aux noms de colonnes invalides dans un QoQ, au sommet de ma tête. – Leigh

Répondre

3

where (cast('Permit No.' as varchar) <> '')

Le problème est le SQL, pas les valeurs. En incluant le nom de la colonne entre guillemets, vous comparez la chaîne littérale "P-e-r-m-i-t N-o-.", Pas les valeurs à l'intérieur de cette colonne. Depuis la chaîne "Permit No." ne peut jamais égaler une chaîne vide, la comparaison renvoie toujours vrai. C'est pourquoi la requête qui en résulte inclut toujours toutes les lignes.

À moins qu'il a été fixé dans ColdFusion 2016, en glissement trimestriel de ne prennent pas en charge les noms de colonnes contenant des caractères non valides comme des espaces. Une solution de contournement consiste à use the "columnNames" attribute to specify valid column names lors de la lecture de la feuille de calcul. Sinon, une autre option est de tirer parti du fait que les colonnes de requête sont des tableaux et de dupliquer les données sous un valide nom de colonne: queryAddColumn(yourQuery, "PermitNo", yourQuery["Permit No."]) (Bien que cette dernière option soit moins idéale car elle peut nécessiter une copie interne des données sous-jacentes):

+0

J'ai fini par renommer les colonnes et la requête fonctionnait beaucoup mieux et donnait 80 lignes plutôt que 42 000. –

+0

Bon à entendre. Des sons comme restreindre les "colonnes" retournées dans la requête avaient l'avantage supplémentaire d'exclure les extras, qui contenaient toutes ces cellules "vides" ;-) – Leigh