/** Datos hstore **/--Maneja datos key-value.--Obtener la extension de hstore para trabajar con este tipo de campos.CREATEEXTENSION hstore;CREATETABLEhprofiles(id serial PRIMARYKEY, profile hstore);INSERTINTOhprofiles(profile)VALUES('name=>Mario, ruby=>true, postgresql=>true');INSERTINTOhprofiles(profile)VALUES('name=>Jedun, javascript=>true, nodejs=>true');SELECT*FROM hprofiles;--"name"=>"Mario","ruby"=>"true","postgresql"=>"true"SELECT profile->'name'AS name, profile->'ruby'as ruby FROM hprofiles;SELECT*FROM hprofiles WHERE(profile->'nodejs')::boolean;SELECT*FROM hprofiles WHERE(profile->'nodejs')::boolean =true;SELECT*FROM hprofiles WHERE profile @>'nodejs=>true';--Trae el registro si existe alguna llave especifica.SELECT*FROM hprofiles WHERE profile ?'nodejs';--Trae el registo si existen las llaves especificadas en el array(and &).SELECT*FROM hprofiles WHERE profile ?&ARRAY['ruby','postgresql'];--Trae el registo si existen al menos las llaves especificadas en el array(or &).SELECT*FROM hprofiles WHERE profile ?|ARRAY['javascript','postgresql'];--Añade una nueva llave-valor en los registros actuales.UPDATE hprofiles SET profile = profile ||'html5=>true'::hstore;--Elimina del campo profile los que tengan llave 'go'.UPDATE hprofiles SET profile =delete(profile,'go');--En un arreglo de text[] obtiene solo las keys.SELECTakeys(profile)FROM hprofiles;--{name,ruby,html5,postgresql}...--Por registros independientes, obtiene solo las keys.SELECTDISTINCTskeys(profile)FROM hprofiles;--Convierte de hstore a json.SELECThstore_to_json(profile)FROM hprofiles;--{"name":"Mario","ruby":"true","html5":"true","postgresql":"true"}...
CREATE EXTENSION hstore;
Para habilitar el hstore
SELECT * FROM hprofiles WHERE profile ? 'ladrar';
Buscar en la columna un valor especifico
Correcto y SELECT * FROM profileh WHERE profile @> ‘sql=>true’; para buscar una llave con un valor.
SELECT * FROM hprofiles WHERE (profile->'ladrar')::boolean;
Query para buscar donde el valor es igual a ladrar y lo convierte a un valor booleano
Y devuelve solo las llaves ‘ladrar’ que tienen un booleano true.
Así es. Por defecto siempre trae los true.
SELECT * FROM hprofiles WHERE profile @> 'python=>true';
Query para preguntar si la columna profile tiene el valor python == true
"||" se usa para concatenar
Query para ingresar un valor a la columna en todos los registros ya existentes:
UPDATE hprofiles SET profile = profile || 'html5=>true'::hstore;
Borrar un valor dentro de todos los registros:
UPDATE hprofiles SET profile = delete(profile,'go');
Query para obtener en un json las llaves de la columna
SELECT hstore_to_json(profile) FROM hprofiles;
SELECT * FROM hprofiles WHERE profile ?& ARRAY['python','ladrar'];
Query para buscar donde el registro tanto sepa python como ladrar
SELECT * FROM hprofiles WHERE profile ?| ARRAY['python','ladrar'];
query para buscar el valor python o el valor ladrar
Query para obtener las llaves en un arreglo:
SELECT akeys(profile) FROM hprofiles;
Se nota bastante que este profesor no prepara el curso, es más el tiempo que se pierde buscando el error que uno encontrando la respuesta.
HStore y JSON son muy parecido, ¿Como decidir cual de los dos tipos ocupar?. De hecho por el video se ve que la sintaxis de HStore es mas sencilla y tiene mas metodos.
Una ventaja de JSON es que es un documento con tipos de datos, se tienen objetos anidados y puedes almacenar algo más que texto, números por ejemplo etc.
Dependiendo de las necesidades de almacenamiento de cada caso se elige uno u otro, sigue estudiando y con la experiencia irás disipando esas dudas.
HStore, trabaja en memoria como redis ?
Y pensar que he estado utilizando PostgreSQL en un 20% jajajaja.
Excelentes clases.
Select para columna hstore (Opción 2)
Funcionamiento de las llaves en Hstore
Select para columna hstore
Eliminar una llave dentro de la columna hstore
Consulta todas la llaves dentro de una columna hstore