2012-04-12 4 views
0

Скажем, у меня есть таблица вроде этого:SQL Получить столбец в одной строке, которая не равна нулю

имя таблицы: Тест

col1 | col2 | col3 | col4 
-------------------------- 
a | 0 | 0 | 1 

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

Есть ли простой способ просто выбрать строку, которая имеет значение 1? только 1 столбец будет иметь целое значение 1 в каждой строке.

Я пытаюсь получить имя столбца этой одной строки, которая не равна нулю. Столбцы в этой таблице будут расти, поэтому я не хочу перечислять каждое имя столбца в моей инструкции sql. Я использую SQLite.

+0

Не обязательно эффективный, но вы можете сделать запрос для каждого поля в схеме. – wachpwnski

+0

Да, я знаю, что вы имеете в виду, но я собираюсь добавить больше столбцов в эту таблицу, поэтому Im пытается избежать этого. –

+0

, который SQL ... У вас есть как MySQL, так и SQLite, не говоря уже о SQL (SQL-сервер, Oracle и многие другие) – DRapp

ответ

1

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

, то я предполагаю, что вы хотите также имя столбца, которое имеет значение «1», поэтому, где вам удается сохранить его в результате?

Я настоятельно рекомендую вам хранить эту информацию в другой таблице, чтобы вы могли быстро достичь того, чего хотите.

+0

Я согласен с @kappa, кажется, очень странная вещь, чтобы попробовать и сделать. Возможно, вам нужна таблица с двумя столбцами - имя и значение или что-то еще, и просто выберите те, где значение> 0. – Simon

+0

да, я понимаю, что вы имеете в виду, это отличная идея –

0

Что-то вроде достижения того, что вы ищете?

create table Test 
(
    col1 nvarchar(100), 
    col2 int, 
    col3 int, 
    col4 int 
) 
insert into Test values('a', 1, 0, 0) 
insert into Test values('b', 0, 2, 0) 
insert into Test values('c', 0, 0, 3) 

select col1, val = case 
    when col2 > 0 then col2 
    when col3 > 0 then col3 
    when col4 > 0 then col4 
    end 
from test 
+0

Фактически Im ищет что-то более похожее: select (col2, col3, col4) где col1 = значение и col2! = 0 и col3! = 0 и col4! = 0; но я бы хотел сделать это, не записывая имя каждого столбца.Я просто хочу, чтобы один столбец не был нулевым в col2, col3, col4 –

+0

, поэтому вам нужно указывать столбцы при их добавлении. – kappa

+0

@kappa да, но вы могли бы динамически создать этот sql, если это необходимо. – Simon

0

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

http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm

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

Я закончил тем, что делал это с парой петель, во-первых, натягивая массив имен таблиц из sqlite_master таблицы, а затем еще один цикл, чтобы цикл через каждый имя столбца, которое я вытаскиваю из dbCursor.description. http://forums.fedoraforum.org/showthread.php?t=219441

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

SELECT 'Col1' AS Column 
FROM Table 
WHERE Col1 = 1 
UNION ALL 
SELECT 'Col2' AS Column 
FROM Table 
WHERE Col2 = 1 
etc. 

Это очень много ручной работы, и это нужно будет обновляться по мере изменения столбцов, но это может быть проще для вас ,

+0

, которая, вероятно, сделает эту работу .. но вы уверены это стоит того? – kappa

+0

@kappa - Ну, это некрасиво, и он не выиграет никаких скоростных наград, но это действительно зависит от человека, который в нем нуждается. Все зависит от обстоятельств. Я бы не проектировал базу данных с этим планом, но если мне пришлось работать с существующей системой, и мне нужен был этот отчет, я бы определенно это рассмотрел. – IAmTimCorey

Смежные вопросы