这可以在 SQL 本身中完成。这可能比让 ColdFusion 尝试进行查询处理的性能要高得多。
根据您最初的问题,我做了几个假设。首先,这个查询应该只返回 1 个结果 (TOP 1)。其次,您的默认语言是2 对应Default1 和1 对应Default2。这还包括您要搜索的值将大于 1 或 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
;
这是有效的,因为如果过滤条件不匹配,查询将不会返回任何结果,但是当加入到有结果的查询(您的默认值)时,这些结果将出现在整个查询中。然后我对结果进行排序并获得前 1 名。
查询的基本要点在:https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=6f729939d3305e49032eab56d88aa877
我还提供了几个演示,说明如果找不到您的LanguageID,这是如何工作的,以及使用不是1 或2 的默认IDs 的一种可能方式。
并将所有内容保存在一个地方:
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
;
编号 |郎
-: | :------
3 |克林贡语
/* 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
;
编号 |郎
-: | :--------
2 |默认 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
;
编号 |郎
-: | :--------
1 |默认 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
;
编号 |郎
-: | :---
/* 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
;
编号 |郎
-: | :------
3 |克林贡语
/* 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
;
编号 |郎
-: | :--------
42 |默认 1
db小提琴here