2009-12-17 4 views
0

У меня есть таблица, где в таблице называется test, у которой есть 4 поля field.one, названных как список, у меня есть 1,2,3,4,5,6 несколько значений, разделенных запятой, мне нужно проверить, в этой таблице и в этом конкретном поле идентификатор id 4 есть или нет .. с помощью SQL-запроса.sql query complex

+3

Какой вкус SQL это? –

+0

Django имеет тип поля CommaSeparatedIntegerField, который, как я думаю, хранится в базе данных в виде текста. Мне трудно найти, как работает взаимодействие с базой данных для этого материала. –

ответ

-3

Как насчет этого?

Select * From Foo Where Col like '%4%' 
+0

или вам нужно было посмотреть, есть ли 4 ',' s – aaron

+3

, которые не будут работать, если у него есть номера более 10 – Drevak

-1

Если вам нужно найти 4 и только 4 (т.е. не 14 или 24, или 40 и т.д.), вы должны использовать

SELECT * FROM foo WHERE col LIKE '%, 4,%' 

или

SELECT * FROM foo WHERE col LIKE '%,4,%' 

если нет пространства между запятые и цифры

+0

, которые не будут работать для «4,5,6» или просто «4» – Thilo

+1

это true, но лично в этой ситуации я бы написал код, который отправляет строку в базу данных, чтобы включить запятую в начале и в конце - или пробел в начале и запятой в конце и удалить первую запятую из запроса - так что запрос всегда будет работать. – AndrewDFrazier

4

Дизайн базы данных неправильный, поэтому у вас возникают проблемы с запросом данных. У вас должны быть значения в отдельной таблице, чтобы научить ценность в собственном поле. Тогда было бы легко найти записи:

select t.testId 
from test t 
inner join listing l on l.testId = t.testId 
where l.id = 4 

Теперь вы должны использовать некоторые уродливые сравнения строк, чтобы найти записи:

select testId 
from test 
where ','+listing+',' like '%,4,%' 
0

Общий подход должен проанализировать список в табличную переменную или табличной функции, затем либо присоединяться к таблице, либо использовать подзапрос EXISTS.

Есть много примеров о том, как это сделать:

http://www.bing.com/search?setmkt=en-US&q=SQL+parse+list+into+table

+0

Предполагается, что SQL Server не уверен в других СУБД. – Brannon

4

Вы можете попробовать

SELECT * 
FROM YourTable 
WHERE REPLACE(Col, ' ', '') LIKE '4,%' --Starts with 
OR REPLACE(Col, ' ', '') LIKE '%,4' --Ends with 
OR REPLACE(Col, ' ', '') LIKE '%,4,%' --Contains 
OR REPLACE(Col, ' ', '') = '4' --Equals 

Подобно тому, как для интереса, посмотрите на эту

DECLARE @delimiter NVARCHAR(5), 
     @Val INT 

SELECT @Val = 40 

SELECT @delimiter = ',' 

DECLARE @YourTable TABLE(
     ID INT, 
     Vals VARCHAR(50) 
) 

INSERT INTO @YourTable (ID,Vals) SELECT 1, '1,2,3,4,5,6,7,8' 

DECLARE @TempTable TABLE(
     ID INT, 
     Vals XML 
) 

INSERT INTO @TempTable 
SELECT ID, 
     CAST('<d>' + REPLACE(Vals, @delimiter, '</d><d>') + '</d>' AS XML) 
FROM @YourTable 

SELECT * 
FROM @TempTable tt 
WHERE EXISTS(
      SELECT T.split.value('.', 'nvarchar(max)') AS data 
      FROM tt.Vals.nodes('/d') T(split) 
      WHERE T.split.value('.', 'nvarchar(max)') = @Val 
) 
+0

, а затем вы должны учитывать пробелы между запятыми, .... +1 хотя. –

+0

Вам не нужно учитывать пробелы между запятыми, если фиксированный точный формат. – Thilo

+0

@Thilo: вы находитесь прямо напротив, но я не буду рассчитывать на это. –

0

Вы можете использовать функцию instring в предложении where и в предложении select :

Oracle:

select substr(column, instr(column, '1', 1), 1) 
where instr(column, '1', 1) > 0 

работает, если вы хотите одно значение. В качестве альтернативы вы можете использовать комбинацию операторов случая или декодирований, чтобы создать один столбец для каждого возможного значения:

select 
decode(instr(column, '1', 1), 0, substr(column, instr(column, '1', 1), 1), null) c1, 
decode(instr(column, '2', 1), 0, substr(column, instr(column, '2', 1), 1), null) c2, 
decode(instr(column, '3', 1), 0, substr(column, instr(column, '3', 1), 1), null) c3 

красоты этого подхода для такого мало нормированного набора данных вы можете сохранить это как вид и затем запустите SQL, поэтому, если вы сохраните вышеуказанное, вы можете использовать:

select c1, c2 from view where c1 is not null or c2 is not null 

NB. В других dbms вам, возможно, придется использовать другой синтаксис, возможно, дело скорее декодирует оператор