Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Връща редове, където ID е низ, разделен с точка и запетая, от подзаявка MSSQL

Това е още един пример за важността на нормализирането на вашите данни.
Поддържането на множество точки от данни в една колона почти никога не е правилният дизайн и под почти никога имам предвид около 99,9999%.

Ако не можете да нормализирате вашата база данни, можете да използвате заобиколно решение като това:

SELECT * 
FROM Projects p
WHERE EXISTS (
    SELECT Project_ID 
    FROM Feedback F WHERE ID = 268 
    AND Project_ID IS NOT NULL
    AND ';'+ F.Project_ID +';' LIKE '%;'+ CAST(p.Project_ID as varchar) +';%'
)

Не можете да използвате IN тъй като очаква списък със стойности, разделени със запетая, докато вие се опитвате да му предоставите една стойност, която е разделена с точка и запетая. Дори ако стойностите в Project_ID бяха разделени със запетая, пак нямаше да работи.

Причината, поради която добавих ; от всяка страна на Project_ID и в двете таблици е, че по този начин LIKE операторът ще върне true за всяко местоположение намира Projects.Project_Id вътре в Feedback.Project_Id . Трябва да добавите ; към Projects.Project_Id за да предотвратите LIKE за връщане на true когато търсите число, което е частично съвпадение с числата в разделения низ. Помислете за търсене на 12 в низ, съдържащ 1;112;455 - без добавяне на разделител към стойността за търсене (12 в този пример) LIKE операторът ще върне true .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на CASE в оператора WHERE, когато параметърът има множество стойности

  2. преименуване на временна таблица във физическа

  3. Как да изберете вложен JSON в SQL Server с OPENJSON

  4. Защо моето ляво присъединяване на t-sql не работи?

  5. Добавете номер на ред към набор от резултати на SQL заявка