2010-07-26 3 views
0

Dans mon tableau, il y a 10 colonnes utilisées pour stocker des "items" (serveur de jeu). Quand un utilisateur choisit l'article, il doit parcourir les colonnes 0-9 (avec les noms "I0" .. "I9") et retourner une fois que la colonne dans la ligne courante est vide. Je ne peux pas comprendre comment le faire du côté du serveur SQL. Je ne peux penser à IF EXISTS pour chaque colonne, mais ce n'est pas vraiment bon .. Content de toute aide! MerciT-SQL: trouver une colonne vide

+7

Cela ressemble beaucoup à un défaut de conception de base de données. Au lieu de colonnes X, vous devez utiliser X lignes pour stocker les éléments. – Tomalak

+0

Pourquoi la vérification EXISTS pour chaque colonne n'est-elle pas bonne? C'est essentiellement ce que vous voulez faire, et probablement le chemin le plus court pour que SQL Server trouve les enregistrements. Tout autre type d'itération basée sur le curseur ou SQL dynamique est probablement un événement moins bon. –

+0

L'énoncé du problème n'est pas clair. Quel est le comportement attendu une fois qu'une colonne vide est trouvée? Que contiennent les lignes? –

Répondre

5

Peut-être qu'il est préférable d'avoir la table items (user_id, item_id) et de limiter le nombre à 10 pour chaque utilisateur?

Il me semble être un bon moyen de normaliser votre table et de résoudre votre problème. De plus, la structure de votre table devient plus flexible - vous pouvez augmenter ou diminuer dynamiquement la limite.

0

Il me semble que vous essayez de trouver une colonne vide pour un utilisateur spécifié (ligne). Et, une colonne vide contient NULL. En supposant que c'est correct et en ignorant les soucis concernant la conception correcte, voici quelque chose qui retournera le numéro de la première colonne qui contient une valeur NULL.

SELECT CASE 
    WHEN I0 IS NULL THEN 0 
    WHEN I1 IS NULL THEN 1 
    WHEN I2 IS NULL THEN 2 
    WHEN I3 IS NULL THEN 3 
    WHEN I4 IS NULL THEN 4 
    WHEN I5 IS NULL THEN 5 
    WHEN I6 IS NULL THEN 6 
    WHEN I7 IS NULL THEN 7 
    WHEN I8 IS NULL THEN 8 
    WHEN I9 IS NULL THEN 9 
    END AS NextColumn 
FROM MyTable 
WHERE UserID = 'Me' 
; 
0
SELECT COALESCE(I0, I1, I2, I3, I4, I5, I6, I7, I8, I9) AS FirstNotNull 
FROM MyTable 
Questions connexes