2009-11-25 5 views
1
SELECT * 
FROM dbo.tbh_table 
WHERE TopicID IN (
    SELECT value 
    FROM dbo.fn_split('19,',') 
) 

Je dois changer ci-dessus requête pour exécuter résultat comme ci-dessouscomment changer cette requête sql

SELECT * 
FROM dbo.tbh_table 
WHERE TopicID LIKE '%19,%' 

Mes valeurs TopicId sont comme ça 15,19,12,1 Mais scission donnera valeurs 15 19 12 1. en raison de laquelle je ne suis pas en mesure d'exécuter la requête.

toute orientation vous aidera

+0

Possédez-vous cette base de données? Peut-être que maintenant serait un bon moment pour le normaliser et avoir un lien entre le dbo.tbh_table et la table Topic. De cette façon, vous pouvez utiliser la théorie des ensembles. La colonne en question (dbo.tbh_table.TopicID) est-elle un VARCHAR? –

+0

Il ya une question connexe (mais pas en double) à http://stackoverflow.com/questions/1609657/sql-server-replacing-single-quotes-and-using-in/1609674#1609674 – Mayo

Répondre

2

En supposant que fn_split est une fonction table (TVF), retournant une TABLE (value INT), utilisez ceci:

SELECT t.* 
FROM dbo.tbh_table t 
CROSS APPLY 
     dbo.fn_split(TopicID) split 
WHERE split.value = 19 
+0

mis en circulation. Je ne savais pas à propos de cross apply. C'est une chose spécifique à sqlserver, n'est-ce pas? – SquareCog

+0

Droite et 15 caractères – Quassnoi

0

Vous pouvez ajouter vos identifiants à une variable de table, puis se joindre à la variable de table pour déterminer si TopicID était dans la variable de table.

DECLARE @DesiredIDs TABLE (
    DesiredID INT 
) 

INSERT INTO @DesiredIDs (DesiredID) Values (15) 
INSERT INTO @DesiredIDs (DesiredID) Values (19) 
INSERT INTO @DesiredIDs (DesiredID) Values (12) 
INSERT INTO @DesiredIDs (DesiredID) Values (1) 

select * from tbh_table t 
left join @DesiredIDs d on d.DesiredID = t.TopicID 
where d.DesiredID is not null 
+0

Si je lis la bonne question , sa question n'est pas "comment puis-je faire correspondre 15 ou 19 ou 12 ou 1", mais "comment faire correspondre 19 à une chaîne de topicId délimitée par des virgules, étant donné que j'ai une fonction de table pour séparer la chaîne". Donc, votre solution ne fonctionne pas. Plus besoin d'une table desiredIds est précisément ce que la clause IN a été inventé. – SquareCog

0

Si je comprends bien votre question, vous voulez quelque chose comme ceci:

SELECT * 
FROM dbo.tbh_table 
WHERE 19 IN ( 
    SELECT value 
    FROM dbo.fn_split(TopicId,',') 
)