This question already has answers here:
Closed 11 years ago.
Possible Duplicate:
MySQL wildcard in select …
SELECT icon_* FROM images WHERE 1
I have three fields, icon_small, icon_big, and icon_large. How do I get all three without manually specifying them?
As far as I know, you can't. You will have to manually specify them.
(See the duplicate)
You have to specify them in your SELECT, but you can select a list of columns (which can then only be used in dynamic SQL) by doing:
select column_name from information_schema.columns
where table_schema = database()
and table_name = 'mytesttable'
and column_name like 'icon_%'
set #qry = (select concat('select ',group_concat(column_name), ' from ' ,table_name) from
information_schema.columns
where table_schema = database()
and table_name = 'your_table_name'
and column_name like 'icon_%');
prepare stmt from #qry;
execute stmt;
deallocate prepare stmt;
Related
I need to call a mySQL function for all columns in a table.
I know how to do it for a particular column
Like this:
UPDATE `table_name` set `column_name` = function_name(`column_name`)
But i have no clue how to do it for all columns at once.
Thanks in advance.
Little clarification: I dont want to manually mention all columns, as i probably could have 200 columns table.
But i have no clue how to do it for all columns at once.
You just can't - there is no such shortcut in the update syntax.
You can do this with a single update statement, but you need to enumerate each and every column, like:
update table_name set
column_name1 = function_name(column_name1),
column_name2 = function_name(column_name2),
column_name3 = function_name(column_name3)
An alternative would be to use dynamic SQL to programatically generate the proper query string from catalog table information_schema.columns, and then execute it. This seems uterly complicated for what looks like a one-shot task... But here is sample code for that:
-- input variables
set #table_schema = 'myschema';
set #table_name = 'mytable';
set #function_name = 'myfunction';
-- in case "GROUP_CONCAT()" returns more than 1024 characters
set session group_concat_max_len = 100000;
-- build the "set" clause of the query string
select
#sql := group_concat(
'`', column_name, '` = ', #table_schema, '.', #function_name, '(`', column_name, '`)'
separator ', '
)
from information_schema.columns
where table_schema = #table_schema and table_name = #table_name;
-- entire query string
set #sql := concat('update ', #table_schema, '.', #table_name, ' set ', #sql);
-- debug
select #sql mysql;
-- execute for real
prepare stmt from #sql;
execute stmt;
deallocate prepare stmt;
This question already has answers here:
Search text in fields in every table of a MySQL database
(27 answers)
Closed 3 years ago.
I have to search for the char ' - ' in all columns (and lines) of my table. Currently I have this:
SELECT *
FROM `my_table`
WHERE (
SELECT C.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.TABLE_NAME = 'my_table'
) LIKE('%-%');
But, of course, this doesn't work because of the multiple values returned by the subquery. Any ideas of how to achieve this?
You can get the query with a SELECT on INFORMATION_SCHEMA.COLUMNS and execute the query with a Prepared SQL Statement on MySQL:
SET #query = '';
SELECT CONCAT('SELECT * FROM table_name WHERE ',GROUP_CONCAT(C.COLUMN_NAME SEPARATOR ' LIKE ''%-%'' OR '), ' LIKE ''%-%''') FROM INFORMATION_SCHEMA.COLUMNS C WHERE C.TABLE_NAME = 'table_name' INTO #query;
PREPARE stmtSearch FROM #query;
EXECUTE stmtSearch;
DEALLOCATE PREPARE stmtSearch;
demo on dbfiddle.uk
This question already has answers here:
Exclude a column using SELECT * [except columnA] FROM tableA?
(47 answers)
Closed 7 years ago.
I am having a table that contains 61 columns.
In the select statement I want to fetch all the columns except two of them.
How can I do it?
Here is the code that fetches data from table:
function hotelfeature($id)
{
global $conn;
$selFeature = "select * from hotelpropertyoptioninfo where Hotel_id = " .$id;
$resultFeature = mysql_query($selFeature,$conn);
$rowFeature = mysql_fetch_assoc($resultFeature);
return $rowFeature;
}
SET #SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '<table>' AND COLUMN_NAME NOT IN ('field1','Field2')),
' FROM <table>');
PREPARE stmt1 FROM #SQL;
EXECUTE stmt1;
The field size of the MySQL daabase I'm working on have been determine quite arbitrary and I'd like to review them based on its current data. So I'd like to determine the maximum number of character per field so I'm sure I won't lose any data when I update the field size.
Is there a feature in phpmyadmin or a SQL statement that can help me?
Thanks
use CHAR_LENGTH, ex
SELECT MAX(CHAR_LENGTH(column1)) maxCol1,
MAX(CHAR_LENGTH(column2)) maxCol2,
MAX(CHAR_LENGTH(column3)) maxCol3
FROM tableName
SQLFiddle Demo
You can also use Dynamic SQL if you have unknown number of columns. All you need to supply is the name of the database and the name of the table,
SET #db_Name = 'db_2_21a29';
SET #tb_name = 'TABLENAME';
SET #sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT('MAX(CHAR_LENGTH(', COLUMN_NAME, ')) AS `', COLUMN_NAME, '`')
) INTO #sql
FROM information_schema.columns
WHERE TABLE_NAME = #tb_name AND
TABLE_SCHEMA = #db_Name;
SET #sql = CONCAT('SELECT ',#sql, 'FROM ', #tb_name);
PREPARE stmt FROM #sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SQLFiddle Demo
In phpmyadmin you are able to know this data from the Structure tab of your table. look at the attached image:
I have 10 fields in my table but i need 8 fields when i select , i dont want to specify select 1,2,3,4,5,6,7,8 from........ ,
Any easy way to get the 8 fields (Other hand i dont want to select primary,unique key fields)
see the answer in this :
Select all columns except one in MySQL?
Actually there is a way, you need to have permissions of course for doing this ...
SET #sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<columns_to_delete>,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table>' AND TABLE_SCHEMA = '<database>'), ' FROM <table>');
PREPARE stmt1 FROM #sql;
EXECUTE stmt1;
Replacing <table>, <database> and <columns_to_delete>