Supposons que vous disposiez d'un long tableau de caractères 1 ou 0, un peu comme un bitvector, mais dans une colonne de base de données. Comment demanderiez-vous de savoir quelles valeurs sont définies/non définies? Supposons que vous ayez besoin de savoir si le char 500 et le char 1500 sont «vrais» ou non.Comment interroger un tableau de caractères 1 et 0 à partir d'une base de données?
Répondre
SELECT
Id
FROM
BitVectorTable
WHERE
SUBSTRING(BitVector, 500, 1) = '1'
AND SUBSTRING(BitVector, 1000, 1) = '1'
Aucun indice ne peut être utilisé pour ce type de requête, cependant. Lorsque vous avez plusieurs lignes, cela devient lent très rapidement. Editer: Sur SQL Server au moins, toutes les fonctions de chaîne intégrées sont deterministic. Cela signifie que vous pouvez étudier la possibilité de créer des colonnes calculées à partir des résultats SUBSTRING() pour l'ensemble de la valeur combinée, putting an index on each of them. Les insertions seront plus lentes, la taille de la table augmentera, mais les recherches seront vraiment rapides.
SELECT
Id
FROM
BitVectorTable
WHERE
BitVector_0500 = '1'
AND BitVector_1000 = '1'
Edit # 2: Les limits for SQL Server sont:
- 1.024 colonnes par table normale
- 30.000 colonnes par "large" Table
En MySQL, en utilisant quelque chose comme substring
select foo from bar
where substring(col, 500,1)='1' and substring(col, 1500,1)='1';
Ce sera assez inefficace si, vous voudrez peut-être repenser votre schéma. Par exemple, vous pouvez stocker chaque bit séparément à l'espace compromis entre la vitesse ...
create table foo
(
id int not null,
bar varchar(128),
primary key(id)
);
create table foobit
(
int foo_id int not null,
int idx int not null,
value tinyint not null,
primary key(foo_id,idx),
index(idx,value)
);
Ce qui serait interrogeable
select foo.bar from foo
inner join foobit as bit500
on(foo.id=bit500.foo_id and bit500.idx=500)
inner join foobit as bit1500
on(foo.id=bit1500.foo_id and bit1500.idx=1500)
where
bit500.value=1 and bit1500.value=1;
consomme évidemment plus de stockage, mais devrait être plus rapide pour les opérations de la requête en tant l'index sera utilisé.
Je convertirais la colonne en plusieurs colonnes de bits et réécrirais le code pertinent - Les masques bit sont tellement plus rapides que les comparaisons de chaînes. Mais si vous ne pouvez pas faire cela, vous devez utiliser des fonctions spécifiques à DB. Les expressions régulières pourraient être une option
-- Flavor: MySql
SELECT * FROM table WHERE column REGEXP "^.{499}1.{999}1"
select substring(your_col, 500,1) as char500,
substring(your_col, 1500,1) as char1500 from your_table;
- 1. Conversion d'une chaîne de 1 et de 0 en un tableau d'octets
- 2. Quelles sont les meilleures pratiques pour interroger des données binaires à partir d'une base de données?
- 3. Comment insérer des caractères spéciaux dans la base de données?
- 4. int [] arr = {0}; valeur int = arr [arr [0] ++]; Valeur = 1?
- 5. Obtention de valeur 0 ou 1 à partir de count() de jeux de nœuds XSL
- 6. Comment puis-je travailler avec des caractères chinois à partir d'une base de données?
- 7. Comment créer une chaîne à partir d'une ligne d'un tableau de caractères rectangulaire bidimensionnel en C#?
- 8. obtenir le nombre entre 0 et 1 du nombre compris entre 0 et n
- 9. UI: "Page 1 sur 0" OU "Page 1 sur 1" OU "Page 0 sur 0" pour ZERO lignes?
- 10. Comment sérialiser des données personnalisées à partir de la base de données?
- 11. Parcourez la base de données et affichez dans le tableau
- 12. Comment sauvegarder une base de données à partir de ServerGrid.com?
- 13. Création d'une liste à deux colonnes à partir d'un tableau de base de données
- 14. la taille des colonnes de base de données pour les données à base de caractères
- 15. Que signifie 0..1 Mean dans EF?
- 16. Tableau de caractères multidimensionnel
- 17. Passer et recevoir un tableau à partir de la fonction
- 18. ASP.NET-Saving caractères spéciaux à la base de données
- 19. Étrange assemblage à partir de l'initialisation 0
- 20. Définir la couleur de la cellule du tableau à partir de la base de données
- 21. Modélisation d'une relation 1 à 1..n dans la base de données
- 22. Comment créer un tableau d'octets à partir de HttpPostedFile
- 23. Comment gérer un nombre variable d'éléments à partir d'une requête de base de données?
- 24. Erreur de nombre d'arguments (0 pour 1)
- 25. Interroger plusieurs tables et renvoyer uniquement un seul tableau?
- 26. Puis-je interroger d'autres bases de données à partir de Wordpress en utilisant PHP/MySQL?
- 27. données à caractère Adjonction nul dans le tableau de caractères pour envoyer des données par socket
- 28. comment exécuter php à partir d'une base de données?
- 29. Rechercher dans le tableau Javascript pour Regex et retourner Vrai/Faux (0/1) si trouvé
- 30. Problème lors de la lecture des données nchar à partir de la base de données Oracle
sont de 500 et 1500 seulement arbitraire positions ou interrogez-vous exactement ces deux encore et encore? – VolkerK
Totalement arbitraire, la requête pourrait être quelque chose d'horrible comme 500,551,1502,234,1001,2035 par exemple –