Coldfusion find if column has value
I have a table which has a column LanguageID. It has seven values: 1, 2, 3, 4, 5, 6, 22
Now I have a function that gets the languageID of the current user.
I want to check if that languageID exists in my table, if it exists return that value, if not then return default 2. If 2 doesn't exist in that table then return 1.
This is my query:
<cfquery name="NameName" datasource="mydatabase">
SELECT DISTINCT SomeID,
SomeName,
LanguageID
FROM myDatabase WITH(NOLOCK)
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#" />
<cfif isDefined(arguments.LanguageID)> //I want to check if the arguments.LanguageID exists in the table
AND LanguageID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.LanguageID#" />
<cfelseif NOT isDefined(arguments.LanguageID) > //ako nema value
AND LanguageID = 2 //default, put languageID to 2
<cfelse>
AND LanguageID = 1 //if languageID 2 doesn't exist in that table, then put 1
</cfif>
</cfquery>
So real life example. The funtion activates, the LanguageID is 3. That's ok, the first cfif check to see if the table has a value of 3, it has, ok then it puts the languageID to 3 and ends.
Second scenario. The funtion activates, the LanguageID is 44. The first cfif checks to see if the table has a value of 44, it doesn't have that value, so the second cfif activates and puts the LanguageID to 2.
sql coldfusion
|
show 3 more comments
I have a table which has a column LanguageID. It has seven values: 1, 2, 3, 4, 5, 6, 22
Now I have a function that gets the languageID of the current user.
I want to check if that languageID exists in my table, if it exists return that value, if not then return default 2. If 2 doesn't exist in that table then return 1.
This is my query:
<cfquery name="NameName" datasource="mydatabase">
SELECT DISTINCT SomeID,
SomeName,
LanguageID
FROM myDatabase WITH(NOLOCK)
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#" />
<cfif isDefined(arguments.LanguageID)> //I want to check if the arguments.LanguageID exists in the table
AND LanguageID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.LanguageID#" />
<cfelseif NOT isDefined(arguments.LanguageID) > //ako nema value
AND LanguageID = 2 //default, put languageID to 2
<cfelse>
AND LanguageID = 1 //if languageID 2 doesn't exist in that table, then put 1
</cfif>
</cfquery>
So real life example. The funtion activates, the LanguageID is 3. That's ok, the first cfif check to see if the table has a value of 3, it has, ok then it puts the languageID to 3 and ends.
Second scenario. The funtion activates, the LanguageID is 44. The first cfif checks to see if the table has a value of 44, it doesn't have that value, so the second cfif activates and puts the LanguageID to 2.
sql coldfusion
The way your condition is, it will never go in cfelse block. Either arguments.LanguageID exists or it does not. So either it goes to 1st part or 2nd.
– CFML_Developer
Nov 23 '18 at 12:07
@CFML_Developer I know that. That's why I'm stuck here :(
– IkePr
Nov 23 '18 at 13:03
If LanguageID has a default value of 2, under what circumstances would it be 1?
– Dan Bracuk
Nov 23 '18 at 13:44
Do you actually mean to check if the table contains a row withLanguageID = 2
and fall back to a row withLanguageID = 1
in case it doesn't?
– Alex
Nov 23 '18 at 19:54
How many rows are you expecting out of this query?
– James A Mohler
Nov 24 '18 at 3:05
|
show 3 more comments
I have a table which has a column LanguageID. It has seven values: 1, 2, 3, 4, 5, 6, 22
Now I have a function that gets the languageID of the current user.
I want to check if that languageID exists in my table, if it exists return that value, if not then return default 2. If 2 doesn't exist in that table then return 1.
This is my query:
<cfquery name="NameName" datasource="mydatabase">
SELECT DISTINCT SomeID,
SomeName,
LanguageID
FROM myDatabase WITH(NOLOCK)
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#" />
<cfif isDefined(arguments.LanguageID)> //I want to check if the arguments.LanguageID exists in the table
AND LanguageID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.LanguageID#" />
<cfelseif NOT isDefined(arguments.LanguageID) > //ako nema value
AND LanguageID = 2 //default, put languageID to 2
<cfelse>
AND LanguageID = 1 //if languageID 2 doesn't exist in that table, then put 1
</cfif>
</cfquery>
So real life example. The funtion activates, the LanguageID is 3. That's ok, the first cfif check to see if the table has a value of 3, it has, ok then it puts the languageID to 3 and ends.
Second scenario. The funtion activates, the LanguageID is 44. The first cfif checks to see if the table has a value of 44, it doesn't have that value, so the second cfif activates and puts the LanguageID to 2.
sql coldfusion
I have a table which has a column LanguageID. It has seven values: 1, 2, 3, 4, 5, 6, 22
Now I have a function that gets the languageID of the current user.
I want to check if that languageID exists in my table, if it exists return that value, if not then return default 2. If 2 doesn't exist in that table then return 1.
This is my query:
<cfquery name="NameName" datasource="mydatabase">
SELECT DISTINCT SomeID,
SomeName,
LanguageID
FROM myDatabase WITH(NOLOCK)
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#" />
<cfif isDefined(arguments.LanguageID)> //I want to check if the arguments.LanguageID exists in the table
AND LanguageID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.LanguageID#" />
<cfelseif NOT isDefined(arguments.LanguageID) > //ako nema value
AND LanguageID = 2 //default, put languageID to 2
<cfelse>
AND LanguageID = 1 //if languageID 2 doesn't exist in that table, then put 1
</cfif>
</cfquery>
So real life example. The funtion activates, the LanguageID is 3. That's ok, the first cfif check to see if the table has a value of 3, it has, ok then it puts the languageID to 3 and ends.
Second scenario. The funtion activates, the LanguageID is 44. The first cfif checks to see if the table has a value of 44, it doesn't have that value, so the second cfif activates and puts the LanguageID to 2.
sql coldfusion
sql coldfusion
edited Nov 24 '18 at 3:04
James A Mohler
7,106123353
7,106123353
asked Nov 23 '18 at 11:44
IkePrIkePr
186215
186215
The way your condition is, it will never go in cfelse block. Either arguments.LanguageID exists or it does not. So either it goes to 1st part or 2nd.
– CFML_Developer
Nov 23 '18 at 12:07
@CFML_Developer I know that. That's why I'm stuck here :(
– IkePr
Nov 23 '18 at 13:03
If LanguageID has a default value of 2, under what circumstances would it be 1?
– Dan Bracuk
Nov 23 '18 at 13:44
Do you actually mean to check if the table contains a row withLanguageID = 2
and fall back to a row withLanguageID = 1
in case it doesn't?
– Alex
Nov 23 '18 at 19:54
How many rows are you expecting out of this query?
– James A Mohler
Nov 24 '18 at 3:05
|
show 3 more comments
The way your condition is, it will never go in cfelse block. Either arguments.LanguageID exists or it does not. So either it goes to 1st part or 2nd.
– CFML_Developer
Nov 23 '18 at 12:07
@CFML_Developer I know that. That's why I'm stuck here :(
– IkePr
Nov 23 '18 at 13:03
If LanguageID has a default value of 2, under what circumstances would it be 1?
– Dan Bracuk
Nov 23 '18 at 13:44
Do you actually mean to check if the table contains a row withLanguageID = 2
and fall back to a row withLanguageID = 1
in case it doesn't?
– Alex
Nov 23 '18 at 19:54
How many rows are you expecting out of this query?
– James A Mohler
Nov 24 '18 at 3:05
The way your condition is, it will never go in cfelse block. Either arguments.LanguageID exists or it does not. So either it goes to 1st part or 2nd.
– CFML_Developer
Nov 23 '18 at 12:07
The way your condition is, it will never go in cfelse block. Either arguments.LanguageID exists or it does not. So either it goes to 1st part or 2nd.
– CFML_Developer
Nov 23 '18 at 12:07
@CFML_Developer I know that. That's why I'm stuck here :(
– IkePr
Nov 23 '18 at 13:03
@CFML_Developer I know that. That's why I'm stuck here :(
– IkePr
Nov 23 '18 at 13:03
If LanguageID has a default value of 2, under what circumstances would it be 1?
– Dan Bracuk
Nov 23 '18 at 13:44
If LanguageID has a default value of 2, under what circumstances would it be 1?
– Dan Bracuk
Nov 23 '18 at 13:44
Do you actually mean to check if the table contains a row with
LanguageID = 2
and fall back to a row with LanguageID = 1
in case it doesn't?– Alex
Nov 23 '18 at 19:54
Do you actually mean to check if the table contains a row with
LanguageID = 2
and fall back to a row with LanguageID = 1
in case it doesn't?– Alex
Nov 23 '18 at 19:54
How many rows are you expecting out of this query?
– James A Mohler
Nov 24 '18 at 3:05
How many rows are you expecting out of this query?
– James A Mohler
Nov 24 '18 at 3:05
|
show 3 more comments
1 Answer
1
active
oldest
votes
This can be done in the SQL itself. That would likely be much more performant than having ColdFusion try to do query processing.
I made a couple of assumptions, based on your original question. First, that this query should only return 1 result (TOP 1
). And second, that your default languages are 2
for Default1
and 1
for Default2
. This also includes that the value you are searching for will be greater than 1 or 2.
SELECT TOP 1 SomeID, SomeName, LanguageID
FROM (
SELECT SomeID, SomeName, LanguageID
FROM t1
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#">
AND LanguageID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Language#">
UNION ALL
SELECT SomeID, SomeName, LanguageID
FROM t1
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#">
AND LanguageID IN ( <cfqueryparam value="1,2" cfsqltype="CF_SQL_INTEGER" list="yes"> ) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
This works because a query will return no results if the filtering condition is not matched, but when joined to a query that does have results (your defaults) those will appear in the whole query. Then I order the results and take the top 1.
The basic gist of the query is at: https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=6f729939d3305e49032eab56d88aa877
I also included several demonstrations of how this works if your LanguageID
is not found, and one possible way of using default ID
s that aren't 1
or 2
.
And to keep it all in one place:
CREATE TABLE t1 ( id int, lang varchar(10) ) ;
INSERT INTO t1 (id, lang)
VALUES (1,'Default 2'),(2,'Default 1'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* If you will only have one language per id, and default IDs will always be 2 and 1 */
/* Match */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t1
WHERE id = 3
UNION ALL
SELECT id, lang
FROM t1
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :------
3 | Klingon
/* No match. */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t1
WHERE id = 99999
UNION ALL
SELECT id, lang
FROM t1
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :--------
2 | Default 1
/* No Default1 Language */
CREATE TABLE t2 ( id int, lang varchar(10) ) ;
INSERT INTO t2 (id, lang)
VALUES (1,'Default 2'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t2
WHERE id = 9999
UNION ALL
SELECT id, lang
FROM t2
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :--------
1 | Default 2
/* No Default Language */
CREATE TABLE t3 ( id int, lang varchar(10) ) ;
INSERT INTO t3 (id, lang)
VALUES (3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* No match. No Default. */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t3
WHERE id = 9999
UNION ALL
SELECT id, lang
FROM t3
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :---
/* Match, but no default */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t3
WHERE id = 3
UNION ALL
SELECT id, lang
FROM t3
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :------
3 | Klingon
/* Default 1 and 2 are not ID 2 and 1. */
CREATE TABLE t4 ( id int, lang varchar(10) ) ;
INSERT INTO t4 (id, lang)
VALUES (40,'Default 2'),(42,'Default 1'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* No match. Pick Default. */
SELECT TOP 1 s1.id, s1.lang
FROM (
SELECT id, lang
FROM t4
WHERE id = 9999
UNION ALL
SELECT s2.id, s2.lang
FROM (
SELECT TOP 1 id, lang
, CASE
WHEN ID = 42 THEN 2
WHEN ID = 40 THEN 1
ELSE 0
END AS sortOrder
FROM t4
WHERE id IN (40,42) /* NEW DEFAULT IDs */
ORDER BY sortOrder DESC
) s2
) s1
ORDER BY s1.id DESC
;
id | lang
-: | :--------
42 | Default 1
db<>fiddle here
I also removedNOLOCK
from the query. See my comment above. blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere
– Shawn
Nov 25 '18 at 22:35
Qapla'! Exactly what I was going to suggest ;-)
– Ageax
Nov 28 '18 at 23:38
1
@Ageax I've already warned you. Being in my head can be a scary place.
– Shawn
Nov 29 '18 at 0:08
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53446096%2fcoldfusion-find-if-column-has-value%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
This can be done in the SQL itself. That would likely be much more performant than having ColdFusion try to do query processing.
I made a couple of assumptions, based on your original question. First, that this query should only return 1 result (TOP 1
). And second, that your default languages are 2
for Default1
and 1
for Default2
. This also includes that the value you are searching for will be greater than 1 or 2.
SELECT TOP 1 SomeID, SomeName, LanguageID
FROM (
SELECT SomeID, SomeName, LanguageID
FROM t1
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#">
AND LanguageID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Language#">
UNION ALL
SELECT SomeID, SomeName, LanguageID
FROM t1
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#">
AND LanguageID IN ( <cfqueryparam value="1,2" cfsqltype="CF_SQL_INTEGER" list="yes"> ) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
This works because a query will return no results if the filtering condition is not matched, but when joined to a query that does have results (your defaults) those will appear in the whole query. Then I order the results and take the top 1.
The basic gist of the query is at: https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=6f729939d3305e49032eab56d88aa877
I also included several demonstrations of how this works if your LanguageID
is not found, and one possible way of using default ID
s that aren't 1
or 2
.
And to keep it all in one place:
CREATE TABLE t1 ( id int, lang varchar(10) ) ;
INSERT INTO t1 (id, lang)
VALUES (1,'Default 2'),(2,'Default 1'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* If you will only have one language per id, and default IDs will always be 2 and 1 */
/* Match */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t1
WHERE id = 3
UNION ALL
SELECT id, lang
FROM t1
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :------
3 | Klingon
/* No match. */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t1
WHERE id = 99999
UNION ALL
SELECT id, lang
FROM t1
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :--------
2 | Default 1
/* No Default1 Language */
CREATE TABLE t2 ( id int, lang varchar(10) ) ;
INSERT INTO t2 (id, lang)
VALUES (1,'Default 2'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t2
WHERE id = 9999
UNION ALL
SELECT id, lang
FROM t2
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :--------
1 | Default 2
/* No Default Language */
CREATE TABLE t3 ( id int, lang varchar(10) ) ;
INSERT INTO t3 (id, lang)
VALUES (3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* No match. No Default. */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t3
WHERE id = 9999
UNION ALL
SELECT id, lang
FROM t3
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :---
/* Match, but no default */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t3
WHERE id = 3
UNION ALL
SELECT id, lang
FROM t3
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :------
3 | Klingon
/* Default 1 and 2 are not ID 2 and 1. */
CREATE TABLE t4 ( id int, lang varchar(10) ) ;
INSERT INTO t4 (id, lang)
VALUES (40,'Default 2'),(42,'Default 1'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* No match. Pick Default. */
SELECT TOP 1 s1.id, s1.lang
FROM (
SELECT id, lang
FROM t4
WHERE id = 9999
UNION ALL
SELECT s2.id, s2.lang
FROM (
SELECT TOP 1 id, lang
, CASE
WHEN ID = 42 THEN 2
WHEN ID = 40 THEN 1
ELSE 0
END AS sortOrder
FROM t4
WHERE id IN (40,42) /* NEW DEFAULT IDs */
ORDER BY sortOrder DESC
) s2
) s1
ORDER BY s1.id DESC
;
id | lang
-: | :--------
42 | Default 1
db<>fiddle here
I also removedNOLOCK
from the query. See my comment above. blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere
– Shawn
Nov 25 '18 at 22:35
Qapla'! Exactly what I was going to suggest ;-)
– Ageax
Nov 28 '18 at 23:38
1
@Ageax I've already warned you. Being in my head can be a scary place.
– Shawn
Nov 29 '18 at 0:08
add a comment |
This can be done in the SQL itself. That would likely be much more performant than having ColdFusion try to do query processing.
I made a couple of assumptions, based on your original question. First, that this query should only return 1 result (TOP 1
). And second, that your default languages are 2
for Default1
and 1
for Default2
. This also includes that the value you are searching for will be greater than 1 or 2.
SELECT TOP 1 SomeID, SomeName, LanguageID
FROM (
SELECT SomeID, SomeName, LanguageID
FROM t1
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#">
AND LanguageID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Language#">
UNION ALL
SELECT SomeID, SomeName, LanguageID
FROM t1
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#">
AND LanguageID IN ( <cfqueryparam value="1,2" cfsqltype="CF_SQL_INTEGER" list="yes"> ) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
This works because a query will return no results if the filtering condition is not matched, but when joined to a query that does have results (your defaults) those will appear in the whole query. Then I order the results and take the top 1.
The basic gist of the query is at: https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=6f729939d3305e49032eab56d88aa877
I also included several demonstrations of how this works if your LanguageID
is not found, and one possible way of using default ID
s that aren't 1
or 2
.
And to keep it all in one place:
CREATE TABLE t1 ( id int, lang varchar(10) ) ;
INSERT INTO t1 (id, lang)
VALUES (1,'Default 2'),(2,'Default 1'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* If you will only have one language per id, and default IDs will always be 2 and 1 */
/* Match */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t1
WHERE id = 3
UNION ALL
SELECT id, lang
FROM t1
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :------
3 | Klingon
/* No match. */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t1
WHERE id = 99999
UNION ALL
SELECT id, lang
FROM t1
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :--------
2 | Default 1
/* No Default1 Language */
CREATE TABLE t2 ( id int, lang varchar(10) ) ;
INSERT INTO t2 (id, lang)
VALUES (1,'Default 2'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t2
WHERE id = 9999
UNION ALL
SELECT id, lang
FROM t2
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :--------
1 | Default 2
/* No Default Language */
CREATE TABLE t3 ( id int, lang varchar(10) ) ;
INSERT INTO t3 (id, lang)
VALUES (3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* No match. No Default. */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t3
WHERE id = 9999
UNION ALL
SELECT id, lang
FROM t3
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :---
/* Match, but no default */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t3
WHERE id = 3
UNION ALL
SELECT id, lang
FROM t3
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :------
3 | Klingon
/* Default 1 and 2 are not ID 2 and 1. */
CREATE TABLE t4 ( id int, lang varchar(10) ) ;
INSERT INTO t4 (id, lang)
VALUES (40,'Default 2'),(42,'Default 1'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* No match. Pick Default. */
SELECT TOP 1 s1.id, s1.lang
FROM (
SELECT id, lang
FROM t4
WHERE id = 9999
UNION ALL
SELECT s2.id, s2.lang
FROM (
SELECT TOP 1 id, lang
, CASE
WHEN ID = 42 THEN 2
WHEN ID = 40 THEN 1
ELSE 0
END AS sortOrder
FROM t4
WHERE id IN (40,42) /* NEW DEFAULT IDs */
ORDER BY sortOrder DESC
) s2
) s1
ORDER BY s1.id DESC
;
id | lang
-: | :--------
42 | Default 1
db<>fiddle here
I also removedNOLOCK
from the query. See my comment above. blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere
– Shawn
Nov 25 '18 at 22:35
Qapla'! Exactly what I was going to suggest ;-)
– Ageax
Nov 28 '18 at 23:38
1
@Ageax I've already warned you. Being in my head can be a scary place.
– Shawn
Nov 29 '18 at 0:08
add a comment |
This can be done in the SQL itself. That would likely be much more performant than having ColdFusion try to do query processing.
I made a couple of assumptions, based on your original question. First, that this query should only return 1 result (TOP 1
). And second, that your default languages are 2
for Default1
and 1
for Default2
. This also includes that the value you are searching for will be greater than 1 or 2.
SELECT TOP 1 SomeID, SomeName, LanguageID
FROM (
SELECT SomeID, SomeName, LanguageID
FROM t1
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#">
AND LanguageID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Language#">
UNION ALL
SELECT SomeID, SomeName, LanguageID
FROM t1
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#">
AND LanguageID IN ( <cfqueryparam value="1,2" cfsqltype="CF_SQL_INTEGER" list="yes"> ) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
This works because a query will return no results if the filtering condition is not matched, but when joined to a query that does have results (your defaults) those will appear in the whole query. Then I order the results and take the top 1.
The basic gist of the query is at: https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=6f729939d3305e49032eab56d88aa877
I also included several demonstrations of how this works if your LanguageID
is not found, and one possible way of using default ID
s that aren't 1
or 2
.
And to keep it all in one place:
CREATE TABLE t1 ( id int, lang varchar(10) ) ;
INSERT INTO t1 (id, lang)
VALUES (1,'Default 2'),(2,'Default 1'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* If you will only have one language per id, and default IDs will always be 2 and 1 */
/* Match */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t1
WHERE id = 3
UNION ALL
SELECT id, lang
FROM t1
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :------
3 | Klingon
/* No match. */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t1
WHERE id = 99999
UNION ALL
SELECT id, lang
FROM t1
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :--------
2 | Default 1
/* No Default1 Language */
CREATE TABLE t2 ( id int, lang varchar(10) ) ;
INSERT INTO t2 (id, lang)
VALUES (1,'Default 2'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t2
WHERE id = 9999
UNION ALL
SELECT id, lang
FROM t2
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :--------
1 | Default 2
/* No Default Language */
CREATE TABLE t3 ( id int, lang varchar(10) ) ;
INSERT INTO t3 (id, lang)
VALUES (3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* No match. No Default. */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t3
WHERE id = 9999
UNION ALL
SELECT id, lang
FROM t3
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :---
/* Match, but no default */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t3
WHERE id = 3
UNION ALL
SELECT id, lang
FROM t3
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :------
3 | Klingon
/* Default 1 and 2 are not ID 2 and 1. */
CREATE TABLE t4 ( id int, lang varchar(10) ) ;
INSERT INTO t4 (id, lang)
VALUES (40,'Default 2'),(42,'Default 1'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* No match. Pick Default. */
SELECT TOP 1 s1.id, s1.lang
FROM (
SELECT id, lang
FROM t4
WHERE id = 9999
UNION ALL
SELECT s2.id, s2.lang
FROM (
SELECT TOP 1 id, lang
, CASE
WHEN ID = 42 THEN 2
WHEN ID = 40 THEN 1
ELSE 0
END AS sortOrder
FROM t4
WHERE id IN (40,42) /* NEW DEFAULT IDs */
ORDER BY sortOrder DESC
) s2
) s1
ORDER BY s1.id DESC
;
id | lang
-: | :--------
42 | Default 1
db<>fiddle here
This can be done in the SQL itself. That would likely be much more performant than having ColdFusion try to do query processing.
I made a couple of assumptions, based on your original question. First, that this query should only return 1 result (TOP 1
). And second, that your default languages are 2
for Default1
and 1
for Default2
. This also includes that the value you are searching for will be greater than 1 or 2.
SELECT TOP 1 SomeID, SomeName, LanguageID
FROM (
SELECT SomeID, SomeName, LanguageID
FROM t1
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#">
AND LanguageID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.Language#">
UNION ALL
SELECT SomeID, SomeName, LanguageID
FROM t1
WHERE BlacklistReasonID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.BlacklistReasonID#">
AND LanguageID IN ( <cfqueryparam value="1,2" cfsqltype="CF_SQL_INTEGER" list="yes"> ) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
This works because a query will return no results if the filtering condition is not matched, but when joined to a query that does have results (your defaults) those will appear in the whole query. Then I order the results and take the top 1.
The basic gist of the query is at: https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=6f729939d3305e49032eab56d88aa877
I also included several demonstrations of how this works if your LanguageID
is not found, and one possible way of using default ID
s that aren't 1
or 2
.
And to keep it all in one place:
CREATE TABLE t1 ( id int, lang varchar(10) ) ;
INSERT INTO t1 (id, lang)
VALUES (1,'Default 2'),(2,'Default 1'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* If you will only have one language per id, and default IDs will always be 2 and 1 */
/* Match */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t1
WHERE id = 3
UNION ALL
SELECT id, lang
FROM t1
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :------
3 | Klingon
/* No match. */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t1
WHERE id = 99999
UNION ALL
SELECT id, lang
FROM t1
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :--------
2 | Default 1
/* No Default1 Language */
CREATE TABLE t2 ( id int, lang varchar(10) ) ;
INSERT INTO t2 (id, lang)
VALUES (1,'Default 2'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t2
WHERE id = 9999
UNION ALL
SELECT id, lang
FROM t2
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :--------
1 | Default 2
/* No Default Language */
CREATE TABLE t3 ( id int, lang varchar(10) ) ;
INSERT INTO t3 (id, lang)
VALUES (3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* No match. No Default. */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t3
WHERE id = 9999
UNION ALL
SELECT id, lang
FROM t3
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :---
/* Match, but no default */
SELECT TOP 1 id, lang
FROM (
SELECT id, lang
FROM t3
WHERE id = 3
UNION ALL
SELECT id, lang
FROM t3
WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;
id | lang
-: | :------
3 | Klingon
/* Default 1 and 2 are not ID 2 and 1. */
CREATE TABLE t4 ( id int, lang varchar(10) ) ;
INSERT INTO t4 (id, lang)
VALUES (40,'Default 2'),(42,'Default 1'),(3,'Klingon')
,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;
/* No match. Pick Default. */
SELECT TOP 1 s1.id, s1.lang
FROM (
SELECT id, lang
FROM t4
WHERE id = 9999
UNION ALL
SELECT s2.id, s2.lang
FROM (
SELECT TOP 1 id, lang
, CASE
WHEN ID = 42 THEN 2
WHEN ID = 40 THEN 1
ELSE 0
END AS sortOrder
FROM t4
WHERE id IN (40,42) /* NEW DEFAULT IDs */
ORDER BY sortOrder DESC
) s2
) s1
ORDER BY s1.id DESC
;
id | lang
-: | :--------
42 | Default 1
db<>fiddle here
answered Nov 25 '18 at 22:32
ShawnShawn
3,51711324
3,51711324
I also removedNOLOCK
from the query. See my comment above. blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere
– Shawn
Nov 25 '18 at 22:35
Qapla'! Exactly what I was going to suggest ;-)
– Ageax
Nov 28 '18 at 23:38
1
@Ageax I've already warned you. Being in my head can be a scary place.
– Shawn
Nov 29 '18 at 0:08
add a comment |
I also removedNOLOCK
from the query. See my comment above. blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere
– Shawn
Nov 25 '18 at 22:35
Qapla'! Exactly what I was going to suggest ;-)
– Ageax
Nov 28 '18 at 23:38
1
@Ageax I've already warned you. Being in my head can be a scary place.
– Shawn
Nov 29 '18 at 0:08
I also removed
NOLOCK
from the query. See my comment above. blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere– Shawn
Nov 25 '18 at 22:35
I also removed
NOLOCK
from the query. See my comment above. blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere– Shawn
Nov 25 '18 at 22:35
Qapla'! Exactly what I was going to suggest ;-)
– Ageax
Nov 28 '18 at 23:38
Qapla'! Exactly what I was going to suggest ;-)
– Ageax
Nov 28 '18 at 23:38
1
1
@Ageax I've already warned you. Being in my head can be a scary place.
– Shawn
Nov 29 '18 at 0:08
@Ageax I've already warned you. Being in my head can be a scary place.
– Shawn
Nov 29 '18 at 0:08
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53446096%2fcoldfusion-find-if-column-has-value%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
The way your condition is, it will never go in cfelse block. Either arguments.LanguageID exists or it does not. So either it goes to 1st part or 2nd.
– CFML_Developer
Nov 23 '18 at 12:07
@CFML_Developer I know that. That's why I'm stuck here :(
– IkePr
Nov 23 '18 at 13:03
If LanguageID has a default value of 2, under what circumstances would it be 1?
– Dan Bracuk
Nov 23 '18 at 13:44
Do you actually mean to check if the table contains a row with
LanguageID = 2
and fall back to a row withLanguageID = 1
in case it doesn't?– Alex
Nov 23 '18 at 19:54
How many rows are you expecting out of this query?
– James A Mohler
Nov 24 '18 at 3:05