Boolean Field in Oracle
I found this link useful.
Here is the paragraph highlighting some of the pros/cons of each approach.
The most commonly seen design is to imitate the many Boolean-like
flags that Oracle's data dictionary views use, selecting 'Y' for true
and 'N' for false. However, to interact correctly with host
environments, such as JDBC, OCCI, and other programming environments,
it's better to select 0 for false and 1 for true so it can work
correctly with the getBoolean and setBoolean functions.
Basically they advocate method number 2, for efficiency's sake, using
- values of 0/1 (because of interoperability with JDBC's
getBoolean()
etc.) with a check constraint - a type of CHAR (because it uses less space than NUMBER).
Their example:
create table tbool (bool char check (bool in (0,1));
insert into tbool values(0);
insert into tbool values(1);`
Oracle's lack of a Bit datatype for table columns
I prefer char(1) over number(1), since with some reasonable choice of characters, it is obvious which character has which boolean meaning.
Of course you should fight all the different varations, choose one and ensure it's use by putting check constraints on the columns.
Although it probably is to late in your case, generating the schema from another tool often takes care at least of the consistency issue. I personally prefer hibernate for this purpose, but that is very situation specific.
And of course that is a glaring obmission. To make it worse, PL/SQL has a boolean, but you can't use it in SQL statements.
How does Liquibase map boolean for oracle?
Create the changelog:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
Run the script
liquibase --changeLogFile=bool_test.xml update
Show the table definition
c:>sqlplus arthur/password
SQL*Plus: Release 12.1.0.1.0 Production on Tue Dec 20 18:19:21 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> select dbms_metadata.get_ddl('TABLE', 'BOOL_TEST') from dual;
DBMS_METADATA.GET_DDL('TABLE','BOOL_TEST')
--------------------------------------------------------------------------------
CREATE TABLE "ARTHUR"."BOOL_TEST"
( "SOME_FLAG" NUMBER(1,0)
) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
TABLESPACE "USERS"
How to use BOOLEAN type in SELECT statement
You can build a wrapper function like this:
function get_something(name in varchar2,
ignore_notfound in varchar2) return varchar2
is
begin
return get_something (name, (upper(ignore_notfound) = 'TRUE') );
end;
then call:
select get_something('NAME', 'TRUE') from dual;
It's up to you what the valid values of ignore_notfound are in your version, I have assumed 'TRUE' means TRUE and anything else means FALSE.
Create boolean attribute in Oracle?
There is no BOOLEAN datatype in SQL. But we can represent it like this:
CREATE TABLE tt
(test NUMBER(1) NOT NULL CHECK (test in (0,1)))
H2 Oracle Mode - Values of types BOOLEAN and INTEGER are not comparable
if this @Query("FROM TABLE_NAME t WHERE t.value= 0")
is exactly what you have, then it means that this is JPQL language, not SQL language. The way that you compare it, it is like the entity related with this has a integer field, which should not be the case. The java field should have been boolean
.
Then this should have been @Query("FROM TABLE_NAME t WHERE t.value= false")
and it would be able to work both for Oracle and H2
By default when you use an ORM vendor like hibernate and you have an Oracle database, the entity field boolean value
will be matched in database level with type of Number(1) where 0 == false
and 1 == true
on ORM layer.
One way for this to work would be to have your entity field as following
@Type(type= "org.hibernate.type.NumericBooleanType")
private Boolean value;
Boolean type - oracle
CREATE TABLE Member
(
mem_id NUMBER(8) CONSTRAINT mem_id_pk PRIMARY KEY,
mem_registeration DATE,
is_eligible number(1) default 0 not null,
constraint ck_is_eligible check ( is_eligible in ( 0, 1 ))
);
(I think. Haven't tested it. Set your default as appropriate for your application.) You can also use 'Y' and 'N' for your pseudo-boolean values. I think it's just a matter of style.
SQL new column with boolean value based on column entry
You can use conditional aggregation
select colA, colB,
max(case when colC=88 then 'True' else 'False' end) as col88,
max(case when colC=66 then 'True' else 'False' end) as col66,
max(case when colC=77 then 'True' else 'False' end) as col77
from tablename
group by colA, colB
Related Topics
Postgresql: Which Datatype Should Be Used for Currency
How to Convert an Integer (Time) to Hh:Mm:Ss::00 in SQL Server 2008
Creating an Index on a Table Variable
How to Pivot in Sqlite or I.E. Select in Wide Format a Table Stored in Long Format
Transpose Latest Rows Per User to Columns
Escaping Ampersand Character in SQL String
Dynamically Create Columns Sql
Using Stored Procedure in Classical Asp .. Execute and Get Results
Error: There Is No Unique Constraint Matching Given Keys For Referenced Table "Bar"
Get All Table Names of a Particular Database by SQL Query
How to Create Composite Primary Key in SQL Server 2008
How to Update Identity Column in SQL Server
Pass Table as Parameter into SQL Server Udf
Why "Extra Characters After Command" Error Shown for the Sed Command Line Shown
Counting Distinct Over Multiple Columns