Поиск во всех столбцах таблицы Informix значений - PullRequest
1 голос
/ 01 декабря 2010

Я новичок в Informix, но не забудьте сделать это с SQL Server.В основном я хочу запросить все столбцы в данной таблице для указанного значения.

Все, что я гуглил, ссылается на SQL Server.

Идеи?

Ответы [ 2 ]

2 голосов
/ 02 декабря 2010

Нет встроенного способа сделать это.Вам нужно будет сделать:

SELECT * FROM Table WHERE Column1 = <your-value>
UNION
SELECT * FROM Table WHERE Column2 = <your-value>
UNION
...

Автоматическая генерация запроса

Существует ли программный способ генерации массовых операторов UNION-SELECT?Некоторые из моих таблиц целей имеют многочисленные столбцы.

Какое оружие вы предпочитаете?Что это за имя базы данных, имя таблицы и значение?Моим оружием выбора является SQLCMD, программа доступна из Архива программного обеспечения IIUG , а не созданного Microsoft в последнее время одноименного создания.

dbname=stores
table=customers
value=Raymond

sqlcmd -D'\n' -d $dbname -e \
    "select 'SELECT * FROM $table WHERE ', c.colname,
            '::VARCHAR(64) = ''$value''', 'UNION'
       from informix.syscolumns as c
       join informix.systables as t on t.tabid = c.tabid
      where t.tabname = '$table' order by colno" |
sed '$d'

Ключевые слова выходного запроса в верхнем регистре;мета-запрос, который генерирует его, находится в нижнем регистре.Мета-запрос представляет собой объединение SysTables с SysColumns.Параметр «-D '\n'» говорит «разделитель полей - это новая строка» (а также разделитель записей).Я удостоверяюсь, что СОЮЗ находится на отдельной линии, чтобы облегчить удаление последнего.Я привел столбцы к VARCHAR (64), чтобы их можно было сравнивать со строкой независимо от типа источника - почти независимо от типа источника, поскольку столбцы BYTE, TEXT, BLOB и CLOB не будут преобразованы.Если вам нужен предикат LIKE '%Raymond%', измените запрос соответствующим образом.

Вы можете добиться аналогичных результатов с Perl и DBI и DBD :: Informix.

Получение вывода с помощью DB-Access будетбеспорядочный;вы, вероятно, использовали бы встроенный 'OUTPUT TO "/dev/stdout" WITHOUT HEADINGS select ...', где ... - это остаток запроса, показанного выше.Затем вам нужно избавиться от последних двух строк вывода, что намного сложнее, чем просто последняя.Вероятно, самое простое - грубая сила - запустите две копии sed '$d' на выходе, но решение плохо масштабируется.В противном случае сохраните вывод в файле и используйте ed или ex для его редактирования.

Пример вывода:

SELECT * FROM customer WHERE
customer_num
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
fname
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
lname
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
company
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
address1
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
address2
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
city
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
state
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
zipcode
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
phone
::VARCHAR(64) = 'Raymond'

Когда вышеприведенный вывод подается во вторую копиюSQLCMD выдает:

 105|Raymond|Vector|Los Altos Sports|1899 La Loma Drive||Los Altos|CA|94022|415-776-3249
0 голосов
/ 24 января 2011

Если вы хотите узнать, для каких таблиц определен столбец, сделайте это >>

select t.tabname from systables t where t.tabid in ( 
    select tabid from syscolumns c where c.colname = 'NAME_OF_THE_COLUMN')

[] s Alf

...