Can we do customized COALESCE() in BigQuery? - google-bigquery

I've been using COALESCE since the first time I used BQ. So basically it looks for a non-NULL value within the bracket.
Is there any way for us to customize it? For example I have two fields that has values either ACTIVE or INACTIVE. I'd like to know whether one of the value from those fields is ACTIVE.
For example:
COALESCE('Inactive', 'Active') returns 'Active'
COALESCE('Active', 'Inactive') returns 'Active'
COALESCE('Inactive', 'Inactive') returns 'Inactive'
Is it possible to use any function for this purpose? Thank you

Use below instead
SELECT
LEAST('Inactive', 'Active'),
LEAST('Active', 'Inactive'),
LEAST('Inactive', 'Inactive')
with output

Related

Replace empty date values with a matching value from the same column?

I have a small query that looks like this:
SELECT
CS.ID,
CS.Import_Date,
CS.Secondary_Date
FROM
Center_Summary CS
ORDER BY CS.Import_Date
Which returns values like this:
And I want to replace these "empty" values which are pulling as 01/01/1900 with the value of 05/01/2019. In this case, it's because the ID and Import_Date match, so the Secondary_Date should match as well. I've thought to use REPLACE() (REPLACE(CS.Secondary_Date, '01/01/1900', ???), but I'm not sure how to write logic to pull in a matching value from the column Secondary_Date based on ID and Import_Date - what function should I be looking to use here?
How it's currently pulling (the dates in red I want to replace):
What my expected result is:
Why not just use a UPDATE with a WHERE?
UPDATE dbo.YourTable
SET SecondaryDate = ImportDate
WHERE SecondaryDate = '19000101';
"Empty" values are best represented by NULL. I would recommend converting them to NULL:
nullif(secondary_date, '1900-01-01')
If you really want another value, then you can use coalesce() or a case expression:
coalesce(nullif(secondary_date, '1900-01-01'), '2019-05-01')
However, I'm not generally a fan of such magic values in the code.

Force result for field as 'NULL' when document was posted after a certain date

I have a query that I am pulling in a department field, however, after a certain date I want this field to be populated as null.
For example, here is the code
Select T6.Segment2 as 'Old Department Code'
I do want this field to pull in the appropriate values, however after a certain date ( 04/01/2019 ) I want this field to show a NULL value.
Is this possible?
Not sure which DBMS you are using but it is basically the same for all of them when it comes to this... You want to use a CASE statement.
What this essentially does is it acts as an IF ELSE in your SELECT.
So in your case (ha, pun) (T-SQL Syntax):
SELECT
CASE
WHEN (YourDateFieldHere) < '04/01/2019' THEN (YourOutputFieldHere)
ELSE NULL
END (AS Alias)
FROM ...
CASE statements can check for multiple criteria, it doesn't have to just be one or the other, in this case just include more lines of WHEN (something) THEN (display this)
You can use case..when
( considering YYYYMMDD is the default format used in SAP at the internal level )
Select case when myDate >'20190104' then
null
else
T6.Segment2
end
as 'Old Department Code'
From yourTable

Get distinct value from a list of T-SQL parameters

I am using a tool to produce SQL queries and I need to filter one of the queries with a multiple parameters.
The query is similar to this:
Select *
From Products
Where (#ProductTypeIds is null or Product.ProductTypeId in (#ProductTypeIds))
I know the above query is not correct on a traditional SQL, read on..
Essentially, I'm trying to apply a filter where if nothing is passed for #ProductTypeIds parameter, the where condition is not applied.
When multiple parameters are being passed, though, #ProductTypeIds is being translated by the tool into the following query:
Select *
From Products
Where (#ProductTypeIds1, #ProductTypeIds2 is null or Product.ProductTypeId in (#ProductTypeIds1, #ProductTypeIds2))
Which is clearly an invalid query. So I thought I could be clever and use COALESCE to check if they are null:
Select *
From Products
Where (COALESCE(#ProductTypeIds, null) is null or Product.ProductTypeId in (#ProductTypeIds))
This query is being translated correctly, however, now my use of COALESCE throws an error:
At least one of the arguments to COALESCE must be an expression that is not the NULL constant.
How can I efficiently check that #ProductTypeIds (which be being translated into #ProductTypeIds1, #ProductTypeIds2 is all null so I can apply the filter or ignore?
In other words, is there a way to Distinct a list of parameters to check if the final result is null ?
Thanks
I have no idea how your tool works, but try the following.
Instead of checking for null check for the value that will never come in your params like:
WHERE COALESCE(#ProductTypeIds1, #ProductTypeIds2, -666) == -666 OR ...

Jaspersoft Domain Designer: Determined what Y/N should be translated to

I have an (Oracle 11g) table with a (single character) "Y/N" flag column. For purposes of simplicity, imagine we're talking about a "Person" table and the column in question is a "Gender Indicator". Without changing the structure of the DB, is there a way to manipulate my result set such that I am able to get "Male" returned for "Y" and "Female" returned for "N"? I have looked into the SQL translate() and replace() functions, but not sure how to do this for multiple rules without having to resort to PLSQL. Any advice would be appreciated.
If this isn't possible via a single , the requirement is for a Domain I am generating in Jasper Reports so any advice on how it may be done that way would help also.
SELECT CASE WHEN Gender_Indicator = 'Y' THEN 'Male' ELSE 'Female' END AS Gender_Indicator FROM MyTable;
This would give you what you are looking for from what I can tell.
You could also use DECODE(Gender_Indicator, 'Y', 'Male', 'N', 'Female')
If you keep gender indicator as Y/N, you can use the ternary if in Jasper Reports inside a text field expression to achieve your goal.
Assuming you have a field in your report (let's call it genderIndicator) that can hold values Y or N, then add a text field with the following expression:
$F{genderIndicator}.equals("Y") ? "Male" : "Female"

SQL and iReport - Aggregate functions in the Where clause and Parameters

Well basically I would like to be able to use a parameter on iReport with an aggregate function.
If you type "yes" it will show you the values greater than 0, if you type "no" it will show the values that are less than 0. However, the aggregate function first adds up all the values related to an id and then it subtracts the result from another value, the result of that is the one I want to show.
How would I be able to do this? I'm clueless as I don't know how to use it with HAVING.
I don't understand what 'it' refers to in "I don't know how to use it with HAVING." The question will be much clearer with some SQL. But I guess you're looking for this:
SELECT id, sum(values) as the_agg
FROM table1
GROUP BY id
HAVING sum(values) $P!{BiggerOrSmaller} 0
The default value for the parameter BiggerOrSmaller should be like this:
$P{MyParam}.equals("yes") ? ">" : "<"
This assumes you have a parmeter called MyParam which can take the value "yes". Based on that value it sets the parameter BiggerOrSmaller appropriately.